宏的注意事项很多,您应该也了解不少。
有一点可能需要额外注意一下,那就是宏的展开顺序。下面的例子会输出什么?
#define concat(a,b) a##b
#define tostring(a) #a
int main(){
printf("%s",tostring(concat(1,2)));
return 0;
}
如果你的答案是 12, 那您就得注意一下了。输出的是 concat(1,2)。
主要就是解析顺序问题。
解析宏时,外部的宏先解析,内部的宏后解析,和函数调用时的解释顺序相反。
所以上例中,tostring被先解析,将括号内的 concat(1,2) 解析为了 "concat(1,2)",再次扫描时字符串内的concat是不会被解析的。
如果C标准规定的解析顺序和函数相同,即先得到 12,再得到 "12",那输出的就是 12 了。
注意一下解析顺序即可。