例如,我有一个宏:
#define PRINT(int) printf(#int "%d\n",int)
我有点知道结果。
但为什么#int代表整个事情?
我有点忘了这个细节。能否有人友好地给我一个提示?
谢谢!
例如,我有一个宏:
#define PRINT(int) printf(#int "%d\n",int)
我有点知道结果。
但为什么#int代表整个事情?
我有点忘了这个细节。能否有人友好地给我一个提示?
谢谢!
在这个上下文中(应用于宏定义中的参数引用),井号表示将此参数扩展为传递给宏的实参的文字文本。
在这种情况下,如果您调用PRINT(5)
,则宏扩展将是printf("5" "%d\n", 5);
,它将打印5 5
;并不是非常有用;但是如果您调用PRINT(5+5)
,宏扩展将是printf("5+5" "%d\n", 5+5);
,它将打印5+5 10
,稍微有点不那么平凡。
这个例子在C预处理器教程中有解释(顺便说一句,这是“c宏井号符”的Google搜索结果的第一个链接)。
5+510
。字符串标记之间的空格被忽略(不转换为空格字符
)。 - Fredrick Gauss55
而不是5 5
。 - user16217248"#"可以显示变量的名称,最好将宏定义为这样:
#define PRINT(i) printf(#i " = %d\n", i)
并像这样使用它:
int i = 5;
PRINT(i);
显示结果:
i = 5
PRINT(5);
它将被替换为
printf("5" "%d\n",5);
printf("5 %d\n",5);
#include<stdio.h>
#define stringLiteral(sl) #sl
int main()
{
char StringizeOpreator = 'a';
printf(stringLiteral(StringizeOpreator));
return 0;
}
在这里,stringLiteral
宏接收形式参数 sl
并返回 #sl
。传递的实际参数是 StringizeOpreator
变量。返回语句 #sl
带有 #
运算符,将引号放在参数周围,例如 "StringizeOpreator"
并返回一个字符串。
因此,上述程序的输出是实际参数 'StringizeOpreator' 的名称,而不是传递的实际参数中存储的值。
output :
StringizeOperator
...
exitcode 0
请访问此链接了解更多信息: 字符串化运算符