#define
d Las macros son globales porque no siguen las reglas normales de alcance C. La sustitución textual de la macro se aplicará (casi) en cualquier parte el nombre de la macro aparece después de su #define
. (Excepciones notables son si el nombre de macro es parte de un comentario o parte de un literal de cadena.)
Si define una macro en un archivo de cabecera, cualquier archivo que #include
s ese archivo de cabecera heredará esa macro (ya sea lo quiera o no), a menos que lo defina explícitamente con #undef
.
En su ejemplo, file2.c
no conoce la macro TEST
. ¿Cómo sabría recoger el #define
de file1.c
? Por magia? Dado que las macros realizan una sustitución textual en el código fuente, no hay representación de ellas en los archivos de objetos generados. file2.c
por lo tanto, necesita conocer esa regla de sustitución en sí, y si desea que se comparta en varios archivos, ese #define
necesita vivir en un archivo de encabezado común que sus archivos .c
#include
.
Si estás preguntando específicamente sobre cuántos de los #ifdef
s que se ven en las bibliotecas trabajan, muchos de ellos son propensos comprobación con nombres de macros predefinidas proporcionadas por el entorno de compilación. Por ejemplo, un compilador C99 define una macro __STDC_VERSION__
que especifica la versión del idioma; un compilador de Microsoft define una macro _MSC_VER
. La mayoría de los compiladores también permiten definir macros simples como argumentos de línea de comandos. Por ejemplo, puede compilar su código a través de gcc -DNDEBUG file1.c
para compilar file.c
con NDEBUG
definido para deshabilitar assert
s.
Depende de dónde se definan. – Nick
'# define' es una directiva de preprocesador - solo hace simples sustituciones de texto en tiempo de compilación - solo la unidad de compilación y cualquier archivo' # include'd * verán * un '# define'. –