turbo simbolos signo significa que poner interrogacion hacer figuras dev corazones como caritas c++ c macros c-preprocessor preprocessor-directive

simbolos - signo de interrogacion en c++



¿Escapando un símbolo#en una macro#define? (8)

El problema no es obtener un símbolo # en la salida de su preprocesador.

Aparentemente, usted quiere que el preprocesador vuelva a rastrear su archivo, para tratar con las nuevas directivas #include como parte de la macro expansión. No funciona de esa manera. Si una línea comienza con #, es una instrucción para el preprocesador e interpretada. Si una línea no comienza con #, solo está sujeta a la transformación del preprocesador, incluida la sustitución de macro. Esta es una prueba de una vez por línea.

MACRO(Test)

no comienza con #. Por lo tanto, no se interpreta como una directiva de preprocesador; en cambio, está sujeto a las reglas de sustitución de macro.

Sin entrar en detalles sangrientos, quiero usar una macro #define que se expandirá a #include pero el signo ''#'' confunde al preprocesador (ya que cree que quiero citar un argumento).

Por ejemplo, quiero hacer algo como esto:

#define MACRO(name) #include "name##foo"

Y úsalo así:

MACRO(Test)

Que se expandirá a:

#include "Testfoo"

El signo # humilde hace que el preprocesador pierda. MinGW me da el siguiente error:

''#'' is not followed by a macro parameter

Supongo que necesito escapar del signo # pero no lo hago si esto es posible.

Sí, las macros son realmente malas ...


Es posible insertar un token hash en la transmisión de token preprocesada. Puedes hacerlo de la siguiente manera:

#define MACRO(hash, name) hash include name MACRO(#,"hello")

-expandir a:

# include "hello"

Sin embargo , el estándar descarta explícitamente cualquier análisis adicional de dicha línea para la existencia de directivas de preprocesamiento [cpp.rescan]:

La secuencia del token de preprocesamiento completamente macro reemplazado resultante no se procesa como una directiva de preproceso, incluso si se parece a uno.


Esto podría funcionar (funciona para macros regulares #define sin parámetros, pero no lo he probado con macros con parámetros).

#define MACRO(name) <name##foo> #include MACRO(Test)


Esto se debe a que el # tiene un significado especial cuando se usa en una macro.

# means quote the following token (which should be a macro parameter name) ## means concatenate the preceding and following tokens.

En su situación, el # no está seguido de un token adecuado. Entonces, en su situación, necesitamos pasar por un nivel de indirección:

#define QUOTE(name) #name #define TEST(name) QUOTE(name ## foo) #include TEST(scot)


No puedes hacer eso. Las directivas de preprocesador se reconocen antes de la macro expansión; si la macro se expande en algo que se parece a una directiva de preprocesador, esa directiva no será reconocida. Lo mejor que puedes hacer es crear una macro para el nombre del archivo:

#define MACRO(name) "name##foo" ... #include MACRO(Test)


Por lo que recuerdo, no puede usar otra directiva de preprocesador en definir.


#define HASH_SIGN # BOOST_PP_CAT(HASH_SIGN, include)


#define PARAM_NAME Param #define GETNAME_(a) #a #define GETNAME(a) GETNAME_(a) int Param; printf("%s = %i/n", GETNAME(PARAM_NAME), PARAM_NAME);