Pregunta

Sin entrar en los detalles morbosos que quiero usar una macro #define que se expandirá a un #include pero el signo '#' es confuso el preprocesador (como se piensa Quiero citar un argumento.)

Por ejemplo, quiero hacer algo como esto:

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

Y el uso de este modo:

MACRO(Test)

que se expandirá a:

#include "Testfoo"

El signo # humilde está causando el preprocesador de vomitar. MinGW me da el siguiente error:

'#' is not followed by a macro parameter

Me parece que necesito para escapar del signo # pero no lo sé si esto es posible.

Sí, las macros son de hecho el mal ...

¿Fue útil?

Solución

Por lo que yo recuerdo no se puede utilizar otra directiva de preprocesador de definir.

Otros consejos

es posible insertar un símbolo de hash en el flujo de señal pre-procesada. Puede hacerlo de la siguiente manera:

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

-expands a:

# include "hello"

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

  

El resultante completamente macro-sustituido preprocesamiento secuencia de tokens no se procesa como una directiva de preprocesamiento incluso si se asemeja a uno.

El problema no es en realidad conseguir un símbolo # en la salida del preprocesador.

Al parecer desea que el preprocesador para reanálisis su archivo, para hacer frente a las directivas # include recién creado como parte de la expansión de macros. No funciona de esa manera. Si una línea comienza con #, que es una instrucción para el preprocesador e interpretado. Si una línea no se inicia con #, sólo es objeto de transformación, incluido el preprocesador sustitución de macro. Esta es una prueba una vez por línea.

MACRO(Test)

no comienza con #. Por lo tanto, no se interpreta como una directiva de preprocesador; sino que es sujeta a reglas de sustitución de macro.

Esto es porque el # tiene un significado especial cuando se utiliza 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 vaya seguida de una muestra adecuada. Así que en su situación tenemos que ir a través de un nivel de indirección:

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

#include TEST(scot)

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

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

Este podría de trabajo (funciona para las macros #define regulares con ningún parámetro, pero no he probado con macros con parámetros).

#define MACRO(name) <name##foo>
#include MACRO(Test)
#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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top