/ / Môžem vytvoriť ďalšie # define's s funkciou preprocesora? - c ++, preprocesorová smernica

Môžem vytvoriť ďalšie # definovať s funkciou preprocesora? - c ++, smernica preprocesora

Viem, že budem potrestaný po tom, čo som o to požiadal, ale ja by som rád urobil niečo také:

#define DEF_CLASS(x) 
#define CLASS x 
#define CONSTRUCTOR CLASS::CLASS 
#define COPY_CONSTRUCTOR(x) CONSTRUCTOR(const CLASS& x)

To je ja "d rád mať" #define "funkciu, ktorá dynamicky definuje iné" #defines ".

Mám IDE, ktoré nie je schopné refactoring, ďalej som "d rád, aby konštruktéri, najmä kopírovať konštruktor vyniknúť vďaka svojej špeciálnej úlohe.
Preto sa snažím naprogramovať definície triedy c ++ takto:

CONSTRUCTOR(int i):i(i){}
COPY_CONSTRUCTOR(other):i(other.i){}
void CLASS::fun1()
{
//...
}

Za to, že v súčasnej dobe musím skopírovať a vložiť tri #define linky. Radšej by som to robil automaticky. Existuje nejaký spôsob, ako to vypnúť pomocou preprocesora?

odpovede:

1 pre odpoveď č. 1

Nie, taký DEF_CLASS(x) makro nie je možné. Makrá nie sú stavové. Najlepšie môžete urobiť:

#define CONSTRUCTOR CLASS::CLASS
#define COPY_CONSTRUCTOR(x) CONSTRUCTOR(const CLASS& x)

...

#define CLASS X
CONSTRUCTOR(int i):i(i){}
COPY_CONSTRUCTOR(other):i(other.i){}
void CLASS::fun1()
{
//...
}
#undef CLASS

#define CLASS Y
CONSTRUCTOR(int i):i(i){}
COPY_CONSTRUCTOR(other):i(other.i){}
void CLASS::fun1()
{
//...
}
#undef CLASS

Ale ja silne naliehajte na vás, aby ste nezneužívali tento preprocesor. Prečo obfuscate normálnu C ++ syntax s týmito makrami? Prijať C + + pre to, čo to je; nesnažte sa urobiť z neho iný, priateľskejší jazyk.


2 pre odpoveď č. 2

Nie - §16.3.4 / 3:

Výsledná kompletne makro-nahradená postupnosť predspracovania tokenu nie je spracovaná ako smernica o predbežnom spracovaní, aj keď sa podobá jednej [...]