50

例如我有一个宏:

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

我有点知道结果是什么。但是#int 怎么会代表整个事情呢?

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

谢谢!

4

4 回答 4

51

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

在这种情况下,如果您调用PRINT(5)宏扩展将是printf("5" "%d\n", 5);which 将打印5 5; 不是很有用;但是,如果您调用PRINT(5+5)宏扩展将是printf("5+5" "%d\n", 5+5);哪个 print 5+5 10,那么微不足道。

这个例子在 C 预处理器的教程中进行了解释(顺便说一下,它是谷歌第一次点击c 宏磅符号)。

于 2013-01-16T05:43:35.377 回答
17

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

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

并像这样使用它:

int i = 5;
PRINT(i);

结果显示:

i = 5
于 2013-01-16T05:56:32.820 回答
6

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

基本上如果我这样写

PRINT(5);

它将被替换为

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

或者

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

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

于 2013-01-16T05:36:46.270 回答
2

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

#include<stdio.h> 

#define stringLiteral(sl) #sl

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

在这里,stringLiteralmarco 接受形式参数sl并返回#sl。传递的实际参数是StringizeOpreator可变的。return 语句#sl#运算符,它在参数周围加上引号"StringizeOpreator"并返回一个字符串。

所以上述程序的输出是实参'StringizeOpreator'的名称,而不是传递的实参中存储的值。

output :
StringizeOperator
...
exitcode 0

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

于 2020-07-20T08:03:05.147 回答