在C语言中,#符号代表预处理器指令。

5

我遇到了这段代码,不确定#reg是在做什么:

#define FPGA_WRITE(reg,val) do { printf("%-20s %08X <<- %08lX\n", #reg, (reg), (unsigned long)(val));} while (0)

int main()
{
   FPGA_WRITE(10,15);
   return 0;
}

这将打印以下内容:

10                   0000000A <<- 0000000F

如果我去掉#,执行代码时会出现段错误。很奇怪。那么#的用法是什么?

6
它将令牌转换为字符串。在您的示例中,FPGA_WRITE(10,15)经过预处理后变成了do { printf("...","10",(10),...); } while(0) - pmg
3
没有进行字符串化,你试图将 int 值 10 当做 char* 来 printf,这是未定义的行为。 - dan04
2
我猜你不是在谈论#define中的那个吧? - Christian Gibbons
2
注意:这仅适用于预处理阶段。 int a = 42; char v[] =#a /*不是“42”!错误!*/; - pmg
5
为了公平对待提问者,查找标点符号在网络上是很困难的。另外,#作为预处理器而非“语言”功能,在C语言“运算符”表格中很少被提及。 - dan04
这个问题能放在常见问题解答中吗? - Mayur
1个回答

7

Stringizing Operator (#)是在#define预处理器宏内部使用的,它将其前面的参数转换为带引号的字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接