Domanda

Senza entrare nei dettagli scabrosi che voglio utilizzare una macro #define che si espanderà a un #include ma il '#' segno è confondere il preprocessore (come si pensa che io voglio citare un argomento.)

Per esempio, io voglio fare qualcosa di simile:

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

E usare così:

MACRO(Test)

che si espanderà a:

#include "Testfoo"

Il segno # umile è la causa del preprocessore Barf. MinGW mi dà il seguente errore:

'#' is not followed by a macro parameter

Credo che ho bisogno di sfuggire il segno #, ma io non se questo è ancora possibile.

Sì, le macro sono davvero male ...

È stato utile?

Soluzione

Per quanto mi ricordo, non è possibile utilizzare un altro direttiva del preprocessore nel definire.

Altri suggerimenti

è possibile inserire un gettone hash nel flusso di token pre-elaborato. Si può fare nel seguente modo:

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

-expands a:

# include "hello"

Tuttavia , lo standard esclude esplicitamente ogni ulteriore analisi di tale linea per l'esistenza di direttive al preprocessore [cpp.rescan]:

  

Il risultante completamente macro-sostituito preelaborazione sequenza di token non viene elaborato come una direttiva preelaborazione anche se analogo a uno.

Il problema non è in realtà sempre il simbolo # nella uscita del preprocessore.

A quanto pare si desidera che il preprocessore rianalizzare il file, a che fare con le direttive # include appena creato come parte della macro espansione. Non funziona in questo modo. Se una linea inizia con #, è un'istruzione per il preprocessore e interpretato. Se una linea non inizia con #, è solo oggetto di preprocessore alla trasformazione, incluso sostituzione macro. Questo è un test una volta-per-line.

MACRO(Test)

non inizia con #. Quindi non viene interpretato come una direttiva preprocessore; invece è soggetta alle regole di sostituzione macro.

Questo perché il # ha un significato speciale se usato in una macro.

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

Nella tua situazione il # non è seguita da una corretta token. Quindi, nella vostra situazione abbiamo bisogno di passare attraverso un livello di indirezione:

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

#include TEST(scot)

Non si può fare questo. direttive del preprocessore sono rilevate prima macro espansione; se la macro si espande in qualcosa che assomiglia a una direttiva del preprocessore, non verrà riconosciuto tale direttiva. Il meglio che puoi fare è creare una macro per il nome del file:

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

Questo potrebbe di lavoro (che funziona per regolare le macro #define senza parametri, ma non l'ho provato con le macro con i parametri).

#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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top