我有一个程序。
#include <stdio.h>
#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
int main()
{
printf("%s\n",h(f(1,2)));
printf("%s\n",g(f(1,2)));
return 0;
}
该程序正常运行并给出输出:
12
f(1, 2)
我不明白编译器如何给出这个输出。
中#的作用是什么a##b
and #a
?
The ##
将两个标记连接在一起。
重要的是它只能在预处理器中使用。
The #
运算符用于对标记进行字符串化。
例如:-
#(a ## b)
这变成#ab
这变成"ab"
所以 h(f(1,2)) 变成“f(1,2)”
另请注意#
and ##
是两个不同的运营商。
预处理器运算符##提供了一种连接实际的方法
宏展开期间的参数。如果替换中的参数
文本与##相邻,该参数被实际替换
参数中,## 和周围的空白被删除,并且
结果被重新扫描。
还要检查这个级联更多细节。
From here:-
字符串化
有时您可能想将宏参数转换为字符串
持续的。参数不会在字符串常量内被替换,但是您
可以使用'#' 预处理运算符代替。当宏参数
与前导“#”一起使用,预处理器将其替换为
实际参数的文字文本,转换为字符串常量。
与普通参数替换不同,参数不是
首先是宏观扩张。这称为字符串化。
没有办法将参数与周围的文本结合起来
将它们串在一起。相反,您可以编写一系列相邻的
字符串常量和字符串化参数。预处理器将
将字符串化参数替换为字符串常量。 C
然后编译器会将所有相邻的字符串常量合并为一个
长字符串。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)