Ipari zen

Szak-irodalom. A fejlesztő jajszava haikuban. A technika ördöge avagy a lelketlen vasban a mélyen emberi.

A szoftverfejlesztés művészete és a zen

2010.03.26. 10:26 Ipari zen

A precompiler matrjoska babája

Címkék: c precompiler stringification

A titokról a
fátyol fellebben. Alant
új fátyol lapul.

Sokszor az ember egészen kis probléma megoldásakor szalad bele jókora pofonba. Nálam most egy verziószám kiírása volt az apropó, a feladat az volt, hogy egy végrehajtható kiírja a verziószámát, mindezt C-ben. A verzió főverzió.mellékverzió.inkremens (pl "8.5.3") formátumban kellett volna megjelenjen és a környezet miatt külön-külön volt egy-egy define-nal beállítva, imígyen
#define VERSION_MAJOR 8
#define VERSION_MINOR 5
#define VERSION_INCREMENT 3

Namár most ezt kellett volna egy
"8.5.3"
értékű stringgé konvertálni. Az első próbálkozások váltakozva eredményeztek
"VERSION_MAJOR.VERSION_MINOR.VERSION_INCREMENT"szerű kiírásokat és válogatott fordítási hibákat. Hosszas guglizás után a precompiler # operátor használata (és a precompiler működésének megértése) jelentette a megoldást. Ugyanis a precompiler "matrjoska baba"-szerűen kezdi el értelmezni a makrókat és a # operátorral rá lehet erőltetni egy makró feloldását. Ha csak a makró neve áll ott akkor szimplán behelyettesíti az nevét, ha #név áll ott akkor fel is fejti a makrót. Íme a győztes megoldás:

#define VERSION VERSION_MAJOR.VERSION_MINOR.VERSION_INCREMENT
#define VERSION_STRING_(X) #X
#define VERSION_STRING(X) VERSION_STRING_(X)

static const char* version = VERSION_STRING(VERSION);
Kissé bonyolult, de működik. Ha valakit mélyebben is érdekel a probléma, jó leírást találhat itt, akár bonyolultabb makrók irásához is.

 

3 komment