Question

Sans entrer dans les détails sordides que je veux utiliser une macro #define qui étendra à un #include mais le signe « # » est confondant le préprocesseur (comme il pense que je veux citer un argument.)

Par exemple, je veux faire quelque chose comme ceci:

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

Et l'utiliser ainsi:

MACRO(Test)

Ce qui va étendre à:

#include "Testfoo"

Le signe humble # est à l'origine du préprocesseur barf. MinGW me donne l'erreur suivante:

'#' is not followed by a macro parameter

Je suppose que je dois échapper le signe #, mais je ne sais pas si cela est encore possible.

Oui, les macros sont en effet mal ...

Était-ce utile?

La solution

Pour autant que je me souviens que vous ne pouvez pas utiliser une autre directive préprocesseur définir.

Autres conseils

est possible d'insérer un jeton de hachage dans le flux jeton prétraité. Vous pouvez le faire comme suit:

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

-expands à:

# include "hello"

Cependant , la norme exclut explicitement une analyse plus poussée de cette ligne pour l'existence de directives de pré-traitement [cpp.rescan]:

  

Le résultat prétraiter complètement macro-séquence remplacé jeton n'est pas traitée comme une directive de pré-traitement, même si elle ressemble à un.

Le problème ne reçoit pas en fait un symbole # dans la sortie de votre préprocesseur.

Il semble que vous voulez que le préprocesseur réanalyser votre dossier, pour faire face aux directives #include nouvellement créées dans le cadre de l'expansion macro. Il ne fonctionne pas de cette façon. Si une ligne commence par #, il est une instruction pour le préprocesseur et interprété. Si une ligne ne commence pas par #, il est seulement soumis à préprocesseur transformation, y compris la substitution macro. Ceci est un test une fois par ligne.

MACRO(Test)

ne commence pas par #. Par conséquent, il est pas interprété comme une directive préprocesseur; Au contraire, il est soumis à des règles de remplacement macro.

En effet, le # a une signification particulière lorsqu'il est utilisé dans une macro.

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

Dans votre situation, le # est pas suivie d'un jeton approprié. Donc, dans votre situation, nous devons passer par un niveau d'indirection:

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

#include TEST(scot)

Vous ne pouvez pas faire cela. directives préprocesseur sont reconnues avant l'expansion macro; si la macro se développe en quelque chose qui ressemble à une directive de préprocesseur, cette directive ne sera pas reconnu. Le mieux que vous pouvez faire est de créer une macro pour le nom du fichier:

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

peut travail (cela fonctionne pour les macros régulières #define sans paramètres, mais je ne l'ai pas testé avec des macros avec des paramètres).

#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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top