C 宏中的#x 是什么意思?

问题描述 投票:0回答:4

例如我有一个宏:

#define PRINT(int) printf(#int "%d\n",int)

我大概知道结果是什么。 但为什么#int代表了整个事情呢?

我有点忘记这个细节了。有人可以给我提示吗?

谢谢!

c macros c-preprocessor stringification
4个回答
61
投票

在此上下文中(应用于宏定义中的参数引用),井号表示将此参数扩展为传递给宏的参数的文字文本。

在这种情况下,如果您调用

PRINT(5)
,宏扩展将是
printf("5" "%d\n", 5);
,它将打印
5 5
;不是很有用;然而,如果你调用
PRINT(5+5)
,宏扩展将是
printf("5+5" "%d\n", 5+5);
,它将打印
5+5 10
,有点不那么简单。

这个例子在 C 预处理器教程中进行了解释(顺便说一句,这是第一个 Google 搜索的 c 宏英镑符号)。


19
投票

“#”可以显示变量的名称,最好这样定义宏:

#define PRINT(i) printf(#i " = %d\n", i)

并像这样使用它:

int i = 5;
PRINT(i);

结果显示:

i = 5

8
投票

对于宏参数来说,这是一个错误的名称选择,但无害(感谢 dreamlax)。

基本上如果我这样写

PRINT(5);

它将被替换为

printf("5" "%d\n",5);

printf("5 %d\n",5);

这是一个称为 Stringification 的过程,#int 被替换为由其内容组成的字符串,5 -> "5"


3
投票

'#'称为字符串化运算符。 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

要了解更多信息,请访问此链接: 字符串化运算符

© www.soinside.com 2019 - 2024. All rights reserved.