2012-05-09 10 views
9

Estoy algo confundido por las declaraciones #define. En las bibliotecas, parecen ser un medio de comunicación entre diferentes archivos, con muchos #ifdef sy #ifndef s.C: ¿Son globales las directivas #define?

Una vez dicho esto, ahora tengo dos archivos file1.c y file2.c compilan juntos, con #define TEST 10 dentro file2.c. Sin embargo, cuando se utiliza dentro de TESTfile2.c el compilador da el siguiente mensaje de error:

'TEST' undeclared (first use in this function) 

son #define directivas global?

+0

Depende de dónde se definan. – Nick

+0

'# 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'. –

Respuesta

13

#define s no son globales, no son más que un cambio en donde quiera que se utilizan (si se declara en la misma unidad de compilación)

Son no globales, son no símbolos, que son irrelevante en el enlace, solo son relevantes en precompilación.

+0

¿Qué quiere decir con "compilar unidad"? ¿Cómo puedo tener 'file1.c' y' file.2' en la misma unidad de compilación? – Randomblue

+1

No. se compilan por separado. y gallina unidas. ¿Estás familiarizado con el proceso de compilación C? – MByD

+0

¿Así 'file1.c' y' file2.c' nunca pueden estar en la misma unidad de compilación? – Randomblue

4

#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.

+0

Thx para obtener información útil – Hydro

1

debe hacer un archivo1.h y poner allí sus definiciones. Luego en el archivo2.c

#include "file1.h" 

fácil como un pastel :)

0

En caso de que alguien lee esto más adelante, y para añadir algo de información práctica:

  • Algunos entornos como Atmel, vs, o IAR, que permitirá para definir las directivas #define globales. Básicamente, pasan estos valores definidos al precompilador en algún formato de línea de comando.
  • Puede hacer lo mismo en los comandos por lotes o en los archivos make, etc.
  • Arduino siempre agrega una variante de placa (generalmente ubicada en hardware \ arduino \ variants) a todas las compilaciones. En ese momento, puede crear una nueva placa que contenga sus directivas de definición global y usarla de esa manera. Por ejemplo, puede definir una placa mega2560 (depuración) fuera del mega2560 original que contiene algunas directivas de depuración. Agregará una referencia a esa variante en "boards.txt", copiando pegando texto y modificándolo adecuadamente.

Al final del día, tendrá que dar ese hfile global o directiva global al compilador de una forma u otra.

Cuestiones relacionadas