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*/