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ď č. 1Nie, 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 [...]