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