2011-06-15 23 views
7

Estoy un poco confundido con el tipo de expresión que podemos usar con el preprocesador #IF en el lenguaje C. Probé el siguiente código, y no está funcionando. Explique y proporcione ejemplos de expresiones que se puedan usar con el preprocesador.Preprocesador C# expresión if

#include<stdio.h> 
#include<conio.h> 
#include<stdlib.h> 

int c=1; 

#if c==1 
    #define check(a) (a==1)?a:5 
    #define TABLE_SIZE 100 
#endif 

int main() 
{ 
    int a = 0, b; 
    printf("a = %d\n", a); 
    b = check(a); 
    printf("a = %d %d\n", a, TABLE_SIZE); 
    system("PAUSE"); 
    return 0; 
} 
+0

¿No proporcionaría una copia del estándar C o de un buen libro la respuesta? Google para "N1570" para encontrar una copia gratuita del último borrador para el estándar C11, por ejemplo. – gnasher729

Respuesta

20

El preprocesador no puede utilizar variables del programa de C en expresiones - que sólo puede actuar sobre macros del preprocesador. Por lo tanto, cuando intente utilizar c en el preprocesador, no obtendrá lo que espera.

Sin embargo, tampoco se obtiene un error porque cuando el preprocesador intenta evaluar un identificador que no está definido como una macro, trata el identificador como que tiene un valor de cero.

Así que cuando se pulse este fragmento:

#if c==1 
#define check(a) (a==1)?a:5 
#define TABLE_SIZE 100 
#endif 

El c utilizado por el preprocesador no tiene nada que ver con la variable c del programa C. El preprocesador busca ver si hay una macro definida para c. Como no lo hay, evalúa la siguiente expresión:

#if 0==1 

que es falso, por supuesto.

Dado que usted no se presenta a utilizar la variable c en su programa, puede hacer lo siguiente para obtener un comportamiento en línea con lo que estamos tratando:

#define C 1 

#if C==1 
#define check(a) (a==1)?a:5 
#define TABLE_SIZE 100 
#endif 

(Tenga en cuenta que también hice la nombre de macro mayúscula de acuerdo con la convención para nombres de macro.)

2

El preprocesador se ejecuta en el texto, antes de realizar cualquier compilación. No sabe cómo analizar C. Lo que probablemente quería en lugar de int c=1; fue

#define C 1 

y la prueba funciona de la manera que lo tenía:

#if C == 1 

La clave aquí es que esto es todo definido antes de tiempo de compilación. Al preprocesador no le importan las variables C, y ciertamente no le importan sus valores.

Tenga en cuenta que la convención es tener nombres de macro de preprocesador definidos en ALL_CAPS.

0

El preprocesador no evalúa las variables C. Preprocesa el código fuente antes de que se compile y, por lo tanto, tiene su propio idioma. En lugar de hacer esto:

#define c 1 

#if c==1 
#define check(a) (a==1)?a:5 
#define TABLE_SIZE 100 
#endif 
... 
0

En su ejemplo c es un símbolo compilador generado, c no tiene valor hasta que tiempo de ejecución, mientras que las expresiones del preprocesador se evalúan en acumulación de tiempo (de hecho, como su nombre indica antes de que el compilador procese el código), solo puede operar en los símbolos del preprocesador que do existen en el momento de la compilación.

Además, tales expresiones deben ser constantes tiempo de compilación, o de hecho, más exactamente tiempo de preprocesamiento constante, desde expresiones constantes compilador tal como sizeof(...) por ejemplo, son también no definido durante preprocesamiento.