Expresión #if del preprocesador C

3 minutos de lectura

Avatar de usuario de Rohit Jain
Rohit jainista

Estoy un poco confundido sobre el tipo de expresión que podemos usar con el preprocesador #IF en el lenguaje C. Probé el siguiente código y no funciona. Explique y proporcione ejemplos de expresiones que se pueden usar con el preprocesador.

#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;
}

  • ¿No proporcionaría la respuesta una copia del C Standard o cualquier otro buen libro? Busque en Google “N1570” para encontrar una copia gratuita del último borrador del estándar C11, por ejemplo.

    – gnasher729

    09/04/2014 a las 10:00

El preprocesador no puede usar variables del programa C en expresiones; solo puede actuar sobre las macros del preprocesador. Así que cuando intentas usar c en el preprocesador no obtienes lo que podrías esperar.

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

Entonces, cuando presionas este fragmento:

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

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

#if 0==1

lo cual es falso por supuesto.

Como no pareces usar la variable c en su programa, puede hacer lo siguiente para obtener un comportamiento en línea con lo que está intentando:

#define C 1

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

(Tenga en cuenta que también puse el nombre de la macro en mayúsculas de acuerdo con la convención para los nombres de las macros).

  • GCC y otros compiladores compatibles con GCC admiten el -Wundef opción para activar las advertencias cuando se utilizan identificadores dentro de una expresión de preprocesador. Esto puede ayudar a prevenir accidentes relacionados con esta característica del preprocesador.

    – jtchitty

    8 de julio de 2020 a las 16:34


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 como la tenías:

#if C == 1

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

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

en tu ejemplo c es un símbolo generado por el compilador, c no tiene valor hasta tiempo de ejecuciónmientras que las expresiones del preprocesador se evalúan en Tiempo de construcción (de hecho, como sugiere el nombre antes de que el compilador procese el código), solo puede operar en símbolos de preprocesador que hacer existen en el momento de la construcción.

Además, tales expresiones deben ser compilar constantes de tiempoo de hecho más exactamente constante de tiempo de preprocesamientoya que las expresiones constantes del compilador como sizeof(...) por ejemplo, tampoco se definen durante el preprocesamiento.

Avatar de usuario de Dave Rager
Dave Rager

El preprocesador no evalúa las variables C. “Preprocesa” el código fuente antes de compilarlo y, por lo tanto, tiene su propio lenguaje. En su lugar haz esto:

#define c 1

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

¿Ha sido útil esta solución?