【发布时间】:2013-05-23 19:49:18
【问题描述】:
我正在玩弄 C 预处理器,但似乎很简单的事情却失败了:
#define STR_START "
#define STR_END "
int puts(const char *);
int main() {
puts(STR_START hello world STR_END);
}
当我用 gcc 编译它时(注意:与 clang 类似的错误),它失败了,出现以下错误:
$ gcc test.c test.c:1:19:警告:缺少终止“字符 test.c:2:17:警告:缺少终止“字符 test.c:在函数“main”中: test.c:7:错误:缺少终止“字符 test.c:7: error: ‘hello’ undeclared (第一次在这个函数中使用) test.c:7: 错误:(每个未声明的标识符只报告一次 test.c:7:错误:对于它出现的每个函数。) test.c:7:错误:“世界”之前的预期“)” test.c:7:错误:缺少终止“字符哪一种让我很困惑,所以我通过预处理器运行它:
$ gcc -E test.c # 1 “测试.c” #1“” #1“” # 1 “测试.c” test.c:1:19:警告:缺少终止“字符 test.c:2:17:警告:缺少终止“字符 int puts(const char *); int main() { puts("你好世界"); }尽管有警告,但生成完全有效的代码(在粗体文本中)!
如果 C 中的宏只是文本替换,为什么我的初始示例会失败?这是编译器错误吗?如果没有,标准中哪里有与这种情况有关的信息?
注意:我不是在寻找如何使我的初始 sn-p 编译。我只是在寻找有关此方案失败原因的信息。
【问题讨论】:
-
您的问题标题有些错误。您可以使用预处理器创建自定义字符串。只是您这样做的尝试是错误的。为此有一个特殊的运算符,
#,称为字符串化。 -
@JensGustedt 不,这不是自定义分隔字符串,只是来自参数的字符串。回滚。
标签: c gcc macros clang c-preprocessor