宏定义形式和使用

宏定义格式

1
#define your_macro_name the_replacement

对于#define中的名字your_macro_name, 和变量名的命名方式相同, 替换文本the_replacement 可以是任意字符串.
通常define指令只占用一行, 如果被替换文本比较长, 可以是用反斜杠\换行.

定义常量

1
#define e 2.71828

任意文本

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
printf("hello " "amos")  

等价于

1
printf("hello amos")  

连接实参

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 char_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, 实际上不是的
因为宏替换为:

1
printf("%d\n", 1+5*1+5)

结果是11, 所以尽可能的加上括号.

取消宏定义

1
2
#define square(x) x*x
#undef square