#define
d macro sono globali in quanto non seguono le normali regole di ambito C. La sostituzione testuale dalla macro verrà applicata (quasi) ovunque il nome della macro viene visualizzato dopo il suo #define
. (Notevoli sono le eccezioni se il nome della macro fa parte di un commento o parte di una stringa letterale.)
Se si definisce una macro in un file di intestazione, qualsiasi file che #include
s quello file di intestazione erediterà quella macro (se essi lo vuoi o no), a meno che non lo definiscano esplicitamente con #undef
.
Nel proprio esempio, file2.c
non conosce la macro TEST
. Come fa a sapere di prendere il #define
da file1.c
? Per magia? Poiché le macro eseguono la sostituzione testuale sul codice sorgente, non vi è alcuna rappresentazione nei file oggetto generato. file2.c
pertanto deve conoscere la regola di sostituzione stessa e, se si desidera condividerla su più file, è necessario che #define
risieda in un file di intestazione comune che i file .c
#include
.
Se stai chiedendo in particolare su come molti dei #ifdef
s che si vedono nelle biblioteche funzionano, molti di loro sono probabilmente controllando contro nomi di macro predefiniti fornite dall'ambiente di compilazione. Ad esempio, un compilatore C99 definisce una macro __STDC_VERSION__
che specifica la versione della lingua; un compilatore Microsoft definisce una macro _MSC_VER
. La maggior parte dei compilatori consente anche di definire semplici macro come argomenti da riga di comando. Ad esempio, è possibile compilare il codice tramite gcc -DNDEBUG file1.c
per compilare file.c
con NDEBUG
definito per disabilitare assert
s.
Dipende da dove sono definiti. – Nick
'# define' è una direttiva preprocessore - semplifica semplicemente le sostituzioni di testo in fase di compilazione - solo l'unità di compilazione e tutti i file' # include'd vedranno * a '# define'. –