Bez toho, aby som šiel do krvavých detailov, chcem použiť #define
makro, ktoré sa rozšíri na #include
ale znak "#" mätie preprocesor (ako si myslí, že chcem citovať argument.)
Chcem napríklad urobiť niečo takéto:
#define MACRO(name) #include "name##foo"
Použite ho takto:
MACRO(Test)
Čo sa rozšíri na:
#include "Testfoo"
Pokorný znak # spôsobí, že preprocesor bude barf. MinGW mi dáva nasledujúcu chybu:
"#" is not followed by a macro parameter
Myslím, že musím uniknúť # podpísať, ale ja don "t, ak je to možné.
Áno, makrá sú naozaj zlé ...
odpovede:
28 pre odpoveď č. 1Pokiaľ si pamätám, nemôžete použiť inú direktívu preprocesora v definícii.
30 pre odpoveď č. 2
to je možné vložiť toh tok do preprocesovaného tokenu tokenu. Môžete to urobiť nasledovne:
#define MACRO(hash, name) hash include name
MACRO(#,"hello")
—Expandy na:
# include "hello"
všaknorma výslovne vylučuje akúkoľvek ďalšiu analýzu tejto línie pre existenciu smerníc o predbežnom spracovaní [cpp.rescan]:
Výsledná sekvencia tokenu nahradená kompletne nahradeným makrometrom nie je spracovaná ako smernica o predbežnom spracovaní, aj keď sa podobá jednej.
27 pre odpoveď č. 3
Problém nie je "t skutočne dostať # symbol vo výstupe vášho preprocesora.
Zrejme chcete preprocesor reparses novo vytvorenými direktívami #include ako súčasť makro expanzie. Nie je to tak, ak riadok začína znakom #, je to inštrukcia pre preprocesor a interpretuje sa. Ak riadok nezačína s #, je to podmienené iba preprocesorovou transformáciou vrátane substitúcie makra. Jedná sa o jednorazový test.
MACRO(Test)
nezačína s #. Preto sa nevykladá ako smernica o preprocesore; namiesto toho podlieha pravidlám nahradenia makra.
10 pre odpoveď č. 4
Je to preto, lebo # má špeciálny význam pri použití v makre.
# means quote the following token (which should be a macro parameter name)
## means concatenate the preceding and following tokens.
Vo vašej situácii # nie je nasledovaný správnym tokenom. Takže vo vašej situácii musíme prejsť úrovňou smeru:
#define QUOTE(name) #name
#define TEST(name) QUOTE(name ## foo)
#include TEST(scot)
6 pre odpoveď č. 5
Môžete to urobiť. Predprocesorové smernice sú rozpoznané pred rozšírením makra; ak sa makro rozšíri do niečoho, čo vyzerá ako smernica preprocesora, táto smernica nebude rozpoznaná. Najlepšie môžete vytvoriť makro pre názov súboru:
#define MACRO(name) "name##foo"
...
#include MACRO(Test)
2 pre odpoveď č. 6
toto sila prácu (funguje pravidelne #define
makrá bez parametrov, ale ja som to netestoval s makrami s parametrami).
#define MACRO(name) <name##foo>
#include MACRO(Test)
0 pre odpoveď č. 7
#define HASH_SIGN #
BOOST_PP_CAT(HASH_SIGN, include)
0 pre odpoveď č. 8
#define PARAM_NAME Param
#define GETNAME_(a) #a
#define GETNAME(a) GETNAME_(a)
int Param;
printf("%s = %in", GETNAME(PARAM_NAME), PARAM_NAME);