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

A bejegyzés trackback címe:

https://ipari-zen.blog.hu/api/trackback/id/tr951869923

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Sopánka76 2010.04.20. 13:49:52

hmm érdekes, de miért kellett két VERSION_STRING makró is?
miért nem volt elég ebből egy?

Sopánka76 2010.04.20. 13:59:16

jó elolvastam a linket, most már értem.
elképzelem miket mondtál, amikor rájöttél a megoldásra! :D

Ipari zen · http://ipari-zen.blog.hu 2010.04.20. 14:10:11

@Sopánka76:
Azt inkább nem írom le, mert a végén még kimoderálnám magam... :)