Macro définie dans main.c non visible dans un autre fichier inclus

J’ai plusieurs fichiers C et H

Dans main.c j’ai défini une macro, et dans ws_driver.c je veux l’utiliser.

ws_driver.h est inclus dans main.c

principal c

 #define WS_PORT PORT_D8 #define WS_BIT D8 #define WS_DDR DDR_D8 #include "ws_driver.h" 

Dans ws_dirver.c j’ai deux vérifications:

ws_driver.c

 #include "ws_driver.h" #ifndef WS_PORT # error "WS_PORT not defined!" #endif #ifndef WS_BIT # error "WS_BIT not defined!" #endif 

Les deux échouent.

 $ avr-gcc -std=gnu99 -mmcu=atmega328p -DF_CPU=16000000UL -Os -I. -I -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wssortingct-prototypes -Wno-main -Wno-ssortingct-prototypes -Wno-comment -g2 -ggdb -ffunction-sections -fdata-sections -Wl,--gc-sections -Wl,--relax -std=gnu99 main.c ws_driver.c --output main.elf ws_driver.c:10:3: error: #error "WS_PORT not defined!" # error "WS_PORT not defined!" ^ ws_driver.c:14:3: error: #error "WS_BIT not defined!" # error "WS_BIT not defined!" ^ ws_driver.c: In function 'ws_show': ws_driver.c:23:20: error: 'WS_PORT' undeclared (first use in this function) #define bus_low() (WS_PORT) &= ~(1 << WS_BIT) ^ ws_driver.c:37:2: note: in expansion of macro 'bus_low' bus_low(); ^ ws_driver.c:23:20: note: each undeclared identifier is reported only once for each function it appears in #define b...... 

Qu’est-ce que je fais mal? S’il vous plaît demander si vous voulez voir une autre partie du code.

Vous devez définir les macros dans un fichier d’en-tête, pas dans le fichier .c si vous souhaitez les utiliser à plusieurs endroits.

Lorsque le compilateur comstack ws_driver.c il ws_driver.c que ws_driver.h et la macro n’y est pas. Il n’inclut pas main.c. Chaque fichier .c est compilé séparément.

Déplacez les définitions de macro dans say config.h et incluez-les partout où vous en avez besoin.

Vous pouvez également utiliser la définition -DWS_BIT=123 -DOTHER=SMTH du compilateur. La valeur que vous transmettez sera dans le fichier object généré et ne peut pas être modifiée sans recompilation.

Si vous ne voulez comstackr qu’une seule fois, transmettez-les comme parameters ou créez une fonction configure_my_library()