例如我有一个宏:
#define PRINT(int) printf(#int "%d\n",int)
我大概知道结果是什么。 但为什么#int代表了整个事情呢?
我有点忘记这个细节了。有人可以给我提示吗?
谢谢!
“#”可以显示变量的名称,最好这样定义宏:
#define PRINT(i) printf(#i " = %d\n", i)
并像这样使用它:
int i = 5;
PRINT(i);
结果显示:
i = 5
对于宏参数来说,这是一个错误的名称选择,但无害(感谢 dreamlax)。
基本上如果我这样写
PRINT(5);
它将被替换为
printf("5" "%d\n",5);
或
printf("5 %d\n",5);
这是一个称为 Stringification 的过程,#int 被替换为由其内容组成的字符串,5 -> "5"
'#'称为字符串化运算符。 Stringize 运算符在传递的参数两边加引号并返回一个字符串。它仅用于带有参数的宏语句中。
#include<stdio.h>
#define stringLiteral(sl) #sl
int main()
{
char StringizeOpreator = 'a';
printf(stringLiteral(StringizeOpreator));
return 0;
}
此处
stringLiteral
宏采用形式参数 sl
并返回 #sl
。传递的实际参数是 StringizeOpreator
变量。 return 语句 #sl
有 #
运算符,它可以像 "StringizeOpreator"
一样在参数周围加上引号并返回一个字符串。
所以上面程序的输出是实参的名称
StringizeOpreator
而不是传递的实参中存储的值。
output :
StringizeOperator
要了解更多信息,请访问此链接: 字符串化运算符