Otlet kellene - C macro
Palasik Sandor
palasik at mail.datanet.hu
Sat Mar 13 22:34:26 CET 2004
> fprintf("%s (%d) ",__FILE__,__LINE__);
Ez sem rossz, én azonban jobban szeretem ezeket fordítási időben
kiértékeltetni.
A következő példa:
#define STR1(y) #y
#define STR(y) STR1(y)
#define SRCLINE __FILE__ "(" STR(__LINE__) "): "
void x()
{
printf(SRCLINE "melting cpu\n");
printf(SRCLINE "done\n");
}
Persze ehhez legalább ANSI C fordító kell, ami tudja, hogy ha két string
konstans van egymás mellett, akkor az össze kell rakni egybe.
A preprocesszor után:
void x()
{
printf("x.c" "(" "7" "): " "melting cpu\n");
printf("x.c" "(" "8" "): " "done\n");
}
Ami viszont már ekvivalens a következővel, úgyhogy ez is kerül bele a kódba. A
stringek hosszabbak lesznek, a kód rövidebb.
void x()
{
printf("x.c(7): melting cpu\n");
printf("x.c(8): done\n");
}
A trükközés az STR STR1 makrókkal azért kell, hogy ne "__LINE__" kerüljön bele
stringként, hanem "7" ill "8".
Néhány kedvenc makróm, szintén a # operátorral:
#define pvd(x) printf(#x ": %d\n",(int)(x))
#define pvx(x) printf(#x ": %X\n",(int)(x))
#define pvg(x) printf(#x ": %g\n",(double)(x))
#define pvs(x) printf(#x ": %s\n",(char *)(x))
Palasik Sándor
More information about the Elektro
mailing list