¿Se pueden anidar las directivas de preprocesador #if en C ++?

84

Tengo una pregunta sobre las directivas de preprocesador en c ++:

Por ejemplo:

#ifndef QUESTION

//some code here

#ifndef QUESTION

//some code here

#endif

#endif

¿Podemos usarlo de esta manera y el compilador de C ++ puede coincidir con ifndefy endifde la manera correcta?

Brian Tompsett - 汤 莱恩
fuente
1
Puede anidar condicionales y puede llamar una macro desde otra, pero no puede anidar macros directamente, por ejemplo #define AAA #define XXX, no funcionará correctamente.
SF.
2
Dado que una pregunta de C acaba de cerrarse como un duplicado de esta, señalaré que las reglas para el preprocesador de C y C ++ son las mismas, al menos en lo que respecta a esta pregunta.
Keith Thompson

Respuestas:

112

Si podemos. La #endifdeclaración coincide con la anterior #if #ifdefo #ifndefetc. para la que no ha habido una correspondencia #endif.

p.ej

#if  ----------|
#if  -----|    |
#endif ---|    |
#endif --------|
Armen Tsirunyan
fuente
tenemos dos #endif aquí, así que el primer #endif coincidirá con el segundo #ifndef?
No coincidirá con el anterior; eso significaría que no podríamos anidarlos.
Fred Foo
49

Sí, puede anidar #if/ #endifbloques. Algunos estilos de codificación C le dirían que escriba

#ifdef CONDITION1
# ifdef CONDITION2
# endif
#endif

usando espacios para denotar el nivel de anidamiento.

Fred Foo
fuente
5
+1 para el bit de anidamiento, a veces ayuda mucho con la claridad.
André Caron
¿Por qué insertarías espacio? ¿Por qué no simplemente #ifdef
aplicar
3
Ni siquiera sabía #que se permitían espacios entre las directivas del preprocesador. ¡Muchas gracias por ese consejo!
AlexR
0

En su código, la sección #ifndef PREGUNTA se descartará a menos que #undef PREGUNTA.

¡Buena suerte!

bert-jan
fuente
Lo siento, leyó mal el código de muestra. Pensé que comenzaba con #ifdef PREGUNTA
bert-jan