使用#define来定义一些宏,进行一些简洁的替换甚至一些带参数的宏,在linux c代码中很常见,说明它很好、很有用,
但是它也有一些复杂的规矩和陷阱需要注意,下面我记录一些,仅供参考。
1、当使用"\"来换行时,第二行要顶格写,否则会多出一个空格。例如:
#define OW "what are you doi \
ng?"第二行的ng?"没有顶格写,那么进行替换的时候,会这样:what are you doi ng?正确的定义为:#define OW "what are you doi\ng?"2、宏可以替换数组的长度,但是const定义的常量不可以。
#define LIMIT 60
const int LMT=12;int a[LIMIT]; //有效int a[LMT]; //无效
原因:在C中,非自动数组的大小应该是整型常量表达式,这意味着数组大小必须是整型常量的组合(如5)、枚举常量和sizeof表达式,但不包括const声明的值。3、多写逗号导致的错误。
可以用__VA_ARGS__进行可变个数的传参,但是_VA_ARGS__在函数体内不要私自加上逗号,比如:
#define PR(x,...) printf("Message "#x":" __VA_ARGS__)
如果写成:
#define PR(x,...) printf("Message "#x":" ,__VA_ARGS__)
就会报错,原因是"Message "#x":"并非和前面的x对应关系,_VA_ARGS__里面仍然可以有字符串。
一个完整的小例子:
1 #include2 3 #define PR(x,...) printf("Message "#x":" __VA_ARGS__) 4 5 int main(void) 6 { 7 double x=48; 8 double y; 9 y=x*x;10 PR(1,"x=%g\n",x);11 PR(2,"ping fang of x is %.2f\n",y);12 13 return 0;14 }