/ / Unikajúci symbol # v makre #define? - c ++, c, makrá, c-preprocesor, smernica preprocesora

Únikom symbolu # v makre #define? - c ++, c, makrá, c-preprocesor, preprocessor-direktíva

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ď č. 1

Pokiaľ 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);