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

时间:2013-01-16 05:34:40

标签: c macros

例如我有一个宏:

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

我知道结果是什么。 但为什么#int会重复整个事情呢?

我有点忘了这个细节。任何人都可以给我一个暗示吗?

谢谢!

4 个答案:

答案 0 :(得分:39)

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

在这种情况下,如果您致电PRINT(5),则宏展开将printf("5" "%d\n", 5);将打印5 5;不是很有用;但是,如果您致电PRINT(5+5),那么宏展开式printf("5+5" "%d\n", 5+5);将会打印5+5 10,而不是那么简单。

这个例子在this tutorial on the C preprocessor中解释(顺便提一下,这是c macro pound sign的第一个Google热门歌曲。)

答案 1 :(得分:11)

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

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

并像这样使用它:

int i = 5;
PRINT(i);

结果显示:

i = 5

答案 2 :(得分:6)

这是宏参数名称的错误选择,但无害(感谢dreamlax)。

基本上如果我这样写

PRINT(5);

它将被替换为

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

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

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

答案 3 :(得分:1)

'#'被称为字符串化运算符。 字符串化运算符在传递的参数周围加上引号,并返回一个字符串。仅在带有参数的marco语句中使用。

#include<stdio.h> 

#define stringLiteral(sl) #sl

int main()
{
   char StringizeOpreator = 'a'; 
   printf(stringLiteral(StringizeOpreator));
   return 0;
}

在这里,“ stringLiteral” marco接受形式参数sl并返回#sl。传递的实际参数是“ StringizeOpreator”。返回语句'#sl'具有'#'运算符,该运算符将引号引起来,例如'“ StringizeOpreator”',并返回一个字符串。

因此,上述程序的输出是实际参数'StringizeOpreator'的名称,而不是存储在传递的实际参数中的值。

要了解更多信息,请访问此链接: Stringize Operator