#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?


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:


21

Simplemente dale la vuelta:


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


Me gusta tu estilo (=
étale-cohomology

6

6

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


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:

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.