宏定义形式和使用
宏定义格式
1
| #define your_macro_name the_replacement
|
对于#define中的名字your_macro_name
, 和变量名的命名方式相同, 替换文本the_replacement
可以是任意字符串.
通常define指令只占用一行, 如果被替换文本比较长, 可以是用反斜杠\
换行.
定义常量
任意文本
1
| #define forever for( ; ; )
|
使用宏forever
1 2 3 4 5 6
| int main() { forever{ printf(1); } return 1; }
|
带参数宏定义
1
| #define max(a,b) ((a)>(b)?(a):(b))
|
使用宏max
1 2 3 4 5
| int main() { int x = max(1, 2); printf("%d",x); return 1; }
|
实参即是实参字符
形参是不可以用带引号的字符串替换, 但是如果想达到传入实参就是所对应的实参字符(即给实参自动加上引号)呢?
比如实参传入 amos
(不带引号), 而我实际想用的是"amos"
1
| #define dprintf("hello " #str)
|
使用dprint
1 2 3 4
| int main() { dprint(amos); return 1; }
|
调用该宏的时候, 该宏被扩展为:
等价于
连接实参
1
| #define paste(name) char_##name
|
1 2 3 4 5 6 7 8 9
| int main() { char paste(a); char paste(b); char_a = 'x'; char_b = 'y'; printf("%c%c\n", char_a, char_b) ; return 1; }
|
多行宏替换
1 2 3 4
| #define loop(a, b) for(int i=0;i<(b);++i)\ {\ (a)+=i;\ }\
|
loop宏的使用:
1 2 3 4 5 6
| int main() { int a = 100, b = 100; loop(a, b); printf("%d\n", a); return 1; }
|
打印为 5050
注意事项
尽可能为每个形参加上括号
1 2 3 4 5 6
| #define square(x) x*x
int main() { printf("%d\n", square(1 + 5)); return 1; }
|
上面这段代码, 感觉上应该打印 36
, 实际上不是的
因为宏替换为:
结果是11
, 所以尽可能的加上括号.
取消宏定义
1 2
| #define square(x) x*x #undef square
|