#ifdef dentro de #define

83

Estoy tratando de escribir algo como esto:

¿Hay alguna forma de definir COV_ONasí? Sé que lo que hice arriba está mal, ya que no puedo tener #ifdefdentro #define. ( #no es un personaje permitido en #define). Entonces, ¿hay alguna solución?

agent.smith
fuente
1
Todas las respuestas aquí parecen omitir el uso de do {} while(0)(o equivalente) para evitar una declaración vacía; vea mi respuesta en el duplicado vinculado
Roger Lipscombe

Respuestas:

89

Imposible. Hazlo al revés:

Hans Passant
fuente
21

Simplemente dale la vuelta:

Felipe
fuente
Gracias por su respuesta. Probé COV_ON (encendido) y COV_ON (apagado) pero luego aparece un error que dice error: esperado ')', casi apagado. Alguna idea sobre el problema.
agent.smith
son cuerdas. ¿Necesito usarlos como cadenas regulares dentro de la cotización? Como "encendido" y "apagado".
agent.smith
Depende de su definición de COBERTURA, pero supongo que debe citarlos. Le sugiero que abra otra pregunta para este nuevo número.
Philip
Lo probé con comillas pero no sirvió de nada. Ya abrí un nuevo hilo. Avíseme si cree que la sintaxis de _Pragma es incorrecta.
agent.smith
14

Esta es una pregunta antigua, pero necesitaba una respuesta actualizada.

En lugar de usar un ifdef en línea dentro de la macro, puede definir selectivamente una __VA_ARGS__macro para hacer lo mismo

Esto tiene una funcionalidad similar a un ifdef, excepto que obtiene paréntesis para delinear el principio y el final (que la mayoría de los IDE no tienen problemas para plegar el código). Aunque todavía puede usar #definey #ifdefdentro del contexto, #includeno está permitido. Para obtener capacidades en línea similares a #else, puede definir una macro correspondiente como esta:

Solo uno de NO_FOO()/IF_FOO producirá código.

De acuerdo, ese es un truco útil, pero ¿podemos hacerlo MÁS útil que #ifdefs... la lógica y la configuración booleanas quizás? Configuremos algunas tablas de verdad (y un par de macros auxiliares).

config.h

code.c

tecnosaurio
fuente
Me gusta tu estilo (=
étale-cohomology
6
EboMike
fuente
6

No se puede. Pero puedes intercambiar #ifdefy #define:

sam hocevar
fuente
Gracias por su respuesta. Probé COV_ON (encendido) y COV_ON (apagado) pero luego aparece un error que dice error: esperado ')', casi apagado. Alguna idea sobre el problema.
agent.smith
Sin conocer su compilador, necesitaríamos saber cuál es la _Pragmasintaxis esperada ; ¿cómo lo harías sin una macro?
sam hocevar
Estoy usando el compilador VC2005 y vi la sintaxis _Pragma en línea. Nunca antes había usado #pragma de esta manera.
agent.smith
Entonces necesitarás un truco de stringify. Vea esta pregunta y respuesta .
sam hocevar
Supongo que el problema es VC2005. No usan _Pragma pero usan __pragma. No estoy seguro, pero se ve así. Pero todavía recibo una advertencia de pragma desconocido con __pragma.
agent.smith
3

Como mencionaste, no es posible tener un #ifdef en un #define. Lo que debería hacer en su lugar es invertir el orden:

jberg
fuente