2011-06-16 19 views
10

El alcance de #define es hasta el final del archivo. Pero, ¿de dónde empieza? Básicamente probé el siguiente código.Alcance del preprocesador #define en C

#include<stdio.h> 
#include<stdlib.h> 
#define pi 3.14 
void fun(); 
int main() 
{ 
printf("%f \n",pi); 
#define pi 3.141516 
    fun(); 
return 0; 
} 
void fun(){ 
printf("%f \n",pi);} 

La salida del programa anterior viene a ser

3.140000 
3.141416 

Teniendo en cuenta el procesamiento previo para main el valor de pi debe ser 3.141516 y fuera principal 3.14. Esto es incorrecto pero por favor explica por qué.

+5

Recuerde que es PREprocessing. No conoce ni se preocupa por la estructura de su código, en el caso de #define está haciendo sustituciones en el orden en que las ve en relación con el valor más reciente de la variable #defined. – Joe

+5

Este código está mal formado: no se puede '# definir' una macro con el mismo nombre que otra macro que esté definida actualmente a menos que sus definiciones sean las mismas. Entonces, el segundo '#define pi' hace que el programa esté mal formado. Primero necesitas '#undef pi'. –

+1

* El alcance de #define es hasta el final del archivo. * No, final del archivo ** o # undef ** del mismo identificador de macro. – Jens

Respuesta

16

El preprocesador C se ejecuta a través del archivo de arriba a abajo y trata las declaraciones #define como una operación glorificada de copiar y pegar. Una vez que encuentra la línea #define pi 3.14, comienza a reemplazar cada instancia de la palabra pi con 3.14. El preprocesador no procesa (ni siquiera nota) los mecanismos de determinación del alcance del lenguaje C, como paréntesis y llaves. Una vez que ve un #define, esa definición está vigente hasta que se llega al final del archivo, la macro no está definida con #undef o (como en este caso) la macro se redefine con otra instrucción #define.

Si quiere constantes que obedezcan las reglas de delimitación C, sugiero usar algo más en las líneas de const float pi = 3.14;.

+1

"o (como en este caso) la macro se redefine con otra instrucción' # define'. " De hecho, el segundo '# define' sin un' 'undef' anterior hace que el programa esté mal formado. –

+1

Tenga en cuenta que 'const' no crea una constante que se pueda utilizar, por ejemplo, en etiquetas de interruptor: crea un objeto de solo lectura. Ejemplo en http://ideone.com/f3aON – pmg

0

Hasta donde yo sé, el preprocesador usa #define declaraciones en el orden en que las encuentra. En ese caso, su primera declaración printf imprime correctamente 3.14 y la segunda 3.141516 (¿hay algún error en el resultado de su programa?).

+0

no .. la salida es correcta ... –

4

El alcance de #define es desde la aparición, hasta el final del archivo, independientemente de cualquier ámbito C intermedio.

1

preprocesador no tiene el concepto de "alcance" - se manipula el texto del programa, sin ninguna idea de lo que el texto es

símbolo se define desde su definición hasta el final de la unidad de compilación (una fuente archivo yy archivos que incluye)

1

Cuando se tiene preprocesador pregunta:

gcc -E foo.c> foo.i; vim foo.i

Cuestiones relacionadas