宏程序的嵌套规律主要包括以下几点:
由内向外展开
一般的展开规律是先展开内层宏,再展开外层宏,就像函数的参数一样。
``运算符
当宏中有``运算符时,参数不再被展开,而是直接将参数作为字符串处理。
``运算符
当宏中有``运算符时,先展开宏,再展开里面的参数。``运算符用于将参数连接到一起,预处理过程把出现在``运算符两侧的参数合并成一个符号,注意不是字符串。
示例
假设有以下宏定义:
```c
define f(a, b) ab
define e(a, b) f(a, b)
define g(a) a
define h(a) g(a)
```
对于以下代码:
```c
int main() {
printf("%s
", h(f(1, 2)));
printf("%s
", g(f(1, 2)));
return 0;
}
```
展开过程如下:
1. `h(f(1, 2))`:
先展开`f(1, 2)`得到`12`。
然后展开`h`得到`g(12)`。
最后展开`g`得到`'12'`。
2. `g(f(1, 2))`:
因为`g`宏中有``运算符,所以参数不再被展开,直接得到`f(1, 2)`。
总结
宏嵌套的展开规律是由内向外,先展开内层宏,再展开外层宏。当宏中有``运算符时,参数作为字符串处理;当宏中有``运算符时,先展开宏,再展开参数。理解这些规则有助于正确使用宏,避免潜在的错误。