Otlet kellene - C macro

Palasik Sandor palasik at mail.datanet.hu
Fri Mar 12 22:45:53 CET 2004


Szerintem fel kéne adnod az agyalást :-) Azt a plusz zárójelpárt tudtommal nem
tudod eltüntetni.

Meg nem nevezett nagy szoftvergyártó termékeiben is lehet ilyeneket látni:

#define Trap()
#define TrapSz(psz)
#define TrapSz1(psz,a1)
#define TrapSz2(psz,a1,a2)
#define TrapSz3(psz,a1,a2,a3)
#define TrapSz4(psz,a1,a2,a3,a4)
#define TrapSz5(psz,a1,a2,a3,a4,a5)
#define TrapSz6(psz,a1,a2,a3,a4,a5,a6)
#define TrapSz7(psz,a1,a2,a3,a4,a5,a6,a7)
#define TrapSz8(psz,a1,a2,a3,a4,a5,a6,a7,a8)
#define TrapSz9(psz,a1,a2,a3,a4,a5,a6,a7,a8,a9)

Csak egyszer kell megcsinálni, szövegszerkesztővel nem túl bonyolult, gondolom
nem is fordul elő gyakran. Ha véletlenül elszámolod magad, hogy hány
paramétered is van, akkor meg figyelmeztet a preprocesszor. Kód nem lesz
belőle, úgyhogy csak a preprocesszort lassítja egy kicsit.

Szerintem még jó is, hogy nem néz ki igazi függvénynek. A mellékhatások miatt
jól meg lehet szívni, mert a függvényparamétereket csak egyszer értékeli ki, a
makrók paramétereit meg ahányszor előfordul a makró belsejében. Mondjuk egy
*p++ kellemetlen tud lenni ilyen esetben.

Van egy másik megoldás, de szerintem az még bénább:

#define mysprintf(a,b) do { {__flash static const char f[] = a; \
  sprintf b ; } while(0)

Ez csak egy makró. Hívni viszont így kell:

mysprintf("%d %d %d",(obuf,f,temp1,temp2,temp2));

Fel kell cserélni a paraméterek sorrendjét és beírni egy extra fix varázsigét
és zárójelet. Szerintem nem éri meg.

Palasik Sándor



More information about the Elektro mailing list