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

And*_*ind 37 c macros

例如,我有一个宏:

#define PRINT(int) printf(#int "%d\n",int)
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

met*_*att 40

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

在这种情况下,如果你调用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命中).

  • @AndersLind:这是标准行为.参见§6.10.3.2/ 2,它详细说明了`#`运算符的语义. (2认同)
  • 实际上是`5 + 510`.字符串标记之间的空格被忽略(不转换为空格char``). (2认同)
  • 现在这个问题是“c 宏磅符号”的第一个谷歌命中:) (2认同)

小智 13

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

#define PRINT(i) printf(#i "= %d\n", i)
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

int i = 5;
PRINT(i);
Run Code Online (Sandbox Code Playgroud)

结果显示:

i = 5
Run Code Online (Sandbox Code Playgroud)


Kar*_*k T 6

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

基本上如果我这样写

PRINT(5);
Run Code Online (Sandbox Code Playgroud)

它将被替换为

printf("5" "%d\n",5);
Run Code Online (Sandbox Code Playgroud)

要么

printf("5 %d\n",5);
Run Code Online (Sandbox Code Playgroud)

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

  • 宏由不了解C类型系统的预处理器扩展。据我所知,`int`不会破坏§6.10(预处理指令)中的任何规则,但是我同意这是一个错误的选择。 (2认同)