#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
int main()
{
printf("%s,", h(f(1,__LINE__)));
printf("%s\n",g(f(1,__LINE__)));
return 0;
}
宏本身只起到一个符号替换的作用,展开宏的过程纯粹是简单的符号替换.
然而,C语言的宏是可以嵌套的,也就是说一个宏的参数可以是另一个宏(函数)。这个时候应该是先展开里面的宏参数还是外面的宏呢?
注:宏参数可以是宏或宏函数
- 一般宏的展开规律是,先展开内层宏参数,再展开外层宏函数,所以展开顺序是由内而外
- 如果宏中有#运算符,则不展开内层宏参数。例如g(__LINE__)的宏__LINE__不会展开,而是转变为字符串。
- 如果宏中有##运算符,则先展开外层宏函数,再展开内层宏参数,展开顺序变成从外到内