【发布时间】:2019-04-11 15:56:52
【问题描述】:
我尝试在我的代码中使用# 运算符:
#include <stdio.h>
int main(void)
{
printf("hello %s !!! n", #world);
return 0;
}
使用 gcc 编译,此代码给出以下错误:
str.c: In function ‘main’:
str.c:5:27: error: stray ‘#’ in program
printf("hello %s !!! n", #world);
但是,当我定义一个使用这个操作符的宏时,代码会被编译:
#include <stdio.h>
#define STRINGIFY(x) #x
int main(void)
{
printf("hello %s \n", STRINGIFY(world));
return 0;
}
这个错误是由预处理器报告的吗?如果是这样,为什么?
【问题讨论】:
-
因为它是这样定义的。在宏之外,您可以用
""很好地包围它 -
@EugeneSh.,在这种情况下不会是字符串文字
"#world"吗? -
@ChristianGibbons 这个错误
error: stray ‘#’ in program。在第二种情况下,gcc -E ...的输出给出了printf("hello %s \n", "world");,这意味着预处理器将STRINGIFY(world)扩展为"world"。所以在第一种情况下,预处理器并没有扩展#运算符,对吧? -
正确,预处理器没有扩展第一个,因为它没有调用预处理器宏。
-
我的意思是你的例子中的用例不能证明允许这种表示法是合理的。我想不出任何办法。
标签: c c-preprocessor language-lawyer