Constantes simbólicas en C (statement #define)

Después de leer algunos de los lenguajes de progtwigción C de K&R, encontré las constantes simbólicas de #define. Decidí definir …

#define INTEGER_EXAMPLE 2 #define CHAR_EXAMPLE 2 

… entonces mi pregunta es ¿cómo sabe C si estoy definiendo un tipo int o char?

Respecto a estos define, no, las macros expandidas no tienen un tipo. El preprocesador que procesa #define simplemente reemplaza el texto dentro del código fuente

Cuando usas estas definiciones en algún lugar, por ejemplo

 int i = INTEGER_EXAMPLE; 

Esto se expandirá a

 int i = 2; 

Aquí el literal 2 (que en este contexto es un int) se asigna a un int.

También podrías hacer:

 char c = INTEGER_EXAMPLE; 

Aquí también, el literal 2 es un int, y está asignado a un char. 2 está dentro de los límites de un char, sin embargo, todo está bien.

Incluso podrías hacer:

 int INTEGER_EXAMPLE = 2; 

Esto se expandiría a

 int 2 = 2; 

Lo cual no es válido C.

#define -d los nombres no tienen tipos. Sólo definen los reemplazos textuales.

Lo que el comstackdor está viendo es la forma preprocesada. Si usa GCC, pruebe con gcc -C -E somesource.c y gcc -C -E somesource.c un vistazo a la salida (preprocesada).

En la década de 1980 el preprocesador era un progtwig separado.

Lea sobre las wikipages preprocesador, preprocesador y preprocesador cpp.

Incluso podrías definir nombres mal definidos como

 #define BAD @*?$ some crap $? 

Y aún más aterrador puedes definir cosas que son sintácticamente incompletas, como

 #define BADTASTE 2 + 

y código posterior BADTASTE 3

En realidad, desea utilizar paréntesis al definir macros. Si usted tiene

 #define BADPROD(x,y) x*y 

luego BADPROD(2+3,4+5) se expande a 2+3*4+5 que el comstackdor entiende como 2+ (3*4) +5 ; de verdad quieres

 #define BETTERPROD(x,y) ((x)*(y)) 

Para que BETTERPROD(2+3,4+5) se expanda a ((2+3)*(4+5))

Evite los efectos secundarios en los argumentos de macro, por ejemplo, BETTERPROD(j++,j--)

En general, use las macros con cuidado y haga que sean sencillas.

#define STRING VALUE

es solo una instrucción para que el preprocesador reemplace la CADENA con VALOR luego el comstackdor tomará el control y verificará los tipos

No es así, este es el preprocesador. El tipo de la constante depende del contexto en el que se utiliza. Por ejemplo:

 #define INT_EXAMPLE 257 char foo = INT_EXAMPLE; 

intentará asignar 257 en un contexto char, lo que generará una advertencia a menos que char tenga más de 8 bits en su computadora.

# definiciones no son más que reemplazos literales de valores. Es posible que desee utilizar

 static const 

Como respeta el scope y es de tipo seguro. Prueba esto:

 #define main no_main int main() // gets replaced as no_main by preprocessor { return 0; } 

Debería darte errores de enlace. O podrías intentar engañar a tu profesor con esto.

 #define I_Have_No_Main_Function main //--> Put this in header file 1.h #include"1.h" int I_Have_No_Main_Function() { return 0; } 

No lo hace Las instrucciones #define se procesan antes de que el comstackdor comience su trabajo. Básicamente, el preprocesador realiza una búsqueda y reemplaza lo que escribió y lo reemplaza, por ejemplo, todas las instancias de INTEGER_EXAMPLE se reemplazan con la cadena 2 .

Depende del comstackdor decidir el tipo de ese 2 según el lugar donde se usa:

 int x = INTEGER_EXAMPLE; // 2 is an integer char y = INTEGER_EXAMPLE; // 2 is a char 

El preprocesador no puede saber el tipo de definición de macro. El preprocesador simplemente reemplazará toda la aparición de ‘CHAR_EXAMPLE’ con ‘2’. Yo usaría el elenco

 #define CHAR_EXAMPLE ((char)2)