Otlet kellene - C macro
Fuzesi Arnold
arno at externet.hu
Sat Mar 13 22:48:22 CET 2004
Ha mar a kedvenc makrok :)
--
typedef struct {
unsigned b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
} bitv;
#define _paste(a,b) a##b
#define bitof(var,num) (((bitv *)&(var))->_paste(b,num))
--
Ezek utan pl:
#define SW_ACLINE bitof(ibuf0,7)
SW_ACLINE=0;
Egyszeruen kezelhetok vele bit szeles valtozok.
Arnold
----- Original Message -----
From: "Palasik Sandor" <palasik at mail.datanet.hu>
To: <elektro at tesla.hu>
Sent: Saturday, March 13, 2004 10:34 PM
Subject: Re: Otlet kellene - C macro
> > 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