简单宏定义
#define A (10)
#define func(x) x++;\
x = x+10;
#define max(a,b) ( ((a)>(b)) ? (a):(b))
#define DEBUG(x) printf(x)
#define func(x) do\
{\
x++;\
x*=10;\
} while(0)
#define f (x) ((x)+1)
#define f(x) ((x)+1)
#define assert(e) \
((void)((e)||_assert_error(__FILE__,__LINE__))
#define DEBUG(fmt,..) fprintf(stderr,fmt,__VA_ARGS__)
#define DEBUG(fmt,..)
复杂宏定义
#define debugprint(...) printf("DEBUG:" __VA_ARGS__);
debugprint("Hello World!\n");
debugprint("i=%i,j=%i\n",i,j);
#define str(x) # x
str (testing) 会展开成 "testing"
printf("Hello World!\n"); 等效于 printf(str (Hello World!\n));
str ("hello") 展开成 "\"hello\""
#define printint(var) # printf(#var " = %i",var)
printfint(count);
printf("count"" = %i",count);
#define printx(n) printf("%i\n",x ##n)
printx(20);
printf("%i\n",x20);
#define printx(n) printint(x ## n)
printx(10)
printint(x10);
printf("x10 = %i\n",x10);
- 不能忽视宏定义中的空格
- 添加完善的括号
- 添加了括号,依旧不能保证没有问题,比如一个操作数如果在两处被用到,就会求值两次
条件编译
#ifdef UNIX
#define DATADIR "/uxn1/data"
#else
#define DATADIR "\uxn1\data"
#endif
gcc -D UNIX program.c
...
...
...
...
...
//
gcc -D OS=2 program.c
//用defined来判断某个符号是否已经定义
...
//等价于下面
...
#if defined(WINDOES) || defined(WINDOWSNT)
#define BOOTDRIVE "C:/"
#else
#define BOOTDRIVE "D:/"
#endif
#undef name
#error text
__LINE__
——FILE__
__DATE__
__TIME__
__STDC__
__STDC_HOSTED__
__STDC_VERSION__