utilizados ser pueden preprocesamiento preprocesador los lenguaje ifdef funcion endif directivas comentarios c c-preprocessor

c - ser - ifdef arduino



¿Cómo se usa#if dentro de#define en el preprocesador C? (2)

Quiero escribir una macro que escupe código basado en el valor booleano de su parámetro. Por lo tanto, supongamos que DEF_CONST(true) debe expandir a const , y DEF_CONST(false) debe expandir a nada.

Claramente, lo siguiente no funciona porque no podemos usar otro preprocesador dentro de #defines:

#define DEF_CONST(b_const) / #if (b_const) / const / #endif


Hacerlo como una macro paramterizada es un poco extraño.

¿Por qué no solo hacer algo como esto?

#ifdef USE_CONST #define MYCONST const #else #define MYCONST #endif

Entonces puedes escribir código como este:

MYCONST int x = 1; MYCONST char* foo = "bar";

y si compila con USE_CONST definido (por ejemplo, típicamente algo -DUSE_CONST en las opciones de compilación o en el archivo MAKE), entonces usará las constelaciones, de lo contrario no lo hará.

Editar: De hecho, veo que Vlad cubrió esa opción al final de su respuesta, así que +1 para él :)


Puede simular condicionales utilizando la concatenación de macro tokens de la siguiente manera:

#define DEF_CONST(b_const) DEF_CONST_##b_const #define DEF_CONST_true const #define DEF_CONST_false

Entonces,

/* OK */ DEF_CONST(true) int x; /* expands to const int x */ DEF_CONST(false) int y; /* expands to int y */ /* NOT OK */ bool bSomeBool = true; // technically not C :) DEF_CONST(bSomeBool) int z; /* error: preprocessor does not know the value of bSomeBool */

Además, permite pasar los parámetros de macro a DEF_CONST (como señalaron correctamente GMan y otros):

#define DEF_CONST2(b_const) DEF_CONST_##b_const #define DEF_CONST(b_const) DEF_CONST2(b_const) #define DEF_CONST_true const #define DEF_CONST_false #define b true #define c false /* OK */ DEF_CONST(b) int x; /* expands to const int x */ DEF_CONST(c) int y; /* expands to int y */ DEF_CONST(true) int z; /* expands to const int z */

También puede considerar el mucho más simple (aunque potencialmente menos flexible):

#if b_const # define DEF_CONST const #else /*b_const*/ # define DEF_CONST #endif /*b_const*/