Dagbok 20091111
Ryska fulmacron
Jag stötte på ett riktigt fult ryskt macro idag. Jag gjorde en enklare version för att illustrera principen - men det tar en sekund eller två innan man inser vad som händer:
#include <stdio.h> int main(int argc, char * argv[]) { int i_1 = 200; int i_2 = 500; #define avg(value) ((value##_1 + value##_2)/2) printf("%d\n", avg(i)); /* ((i_1 + i_2)/2) */ #undef avg return 0; }
De tar alltså i princip ett prefix av en variabel - dunkar in det i ett macro och hoppas att det finns variabler med vissa hårdkodade suffix och räknar lite med dem. Ännu en anledning till att hata macron.
När man kör programmet spottar den ur sig 350 och en blankrad.
Läs mer om Token Concatenation på wikipedia: [1]
Finmacro1: __FILE__ och __LINE__
Men det finns exempel på bra användningsområden av macros. I C99 finns det till exempel en del trevliga fördefinierade macros:
#include <stdio.h> int main(int argc, char * argv[]) { printf("Welcome to %s, compiled at %s - %s\n", __FILE__, __DATE__, __TIME__); printf("This is line %d\n", __LINE__); printf("This is line %d\n", __LINE__); printf("Is this Standard C?: %d\n", __STDC__); return 0; }
Detta exempel spottar ur sig:
Welcome to c-macro-predefs.c, compiled at Nov 11 2009 - 15:50:53 This is line 6 This is line 7 Is this Standard C?: 1
Finmacro2: debug-utskrift
Det inte så underbara fenomenet variadiska (variadic på engelska) macros kan förmodligen bara användas till debug-utskrifter - annars tror jag man är lite hög.
#include <stdio.h> #define DBG_PRINT(...) printf("%s:%d,%s >> ", __FILE__, __LINE__, __func__); printf(__VA_ARGS__); void foo() { DBG_PRINT("bar\n"); } int main(int argc, char * argv[]) { int i = 0; DBG_PRINT("I made %d poo poo(s)\n", ++i); foo(); DBG_PRINT("I made %d poo poo(s)\n", ++i); return 0; }
Resultatet blir:
variadic.c:13,main >> I made 1 poo poo(s) variadic.c:7,foo >> bar variadic.c:15,main >> I made 2 poo poo(s)
Sidan tillhör Kategori Dagbok och Kategori Programmering