我在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中的宏只是文本替换,为什么我的初始示例会失败?这是编译器错误吗?如果没有,标准中哪里有与这种情况有关的信息?
注意:我不是在寻找如何编译我的初始代码段。我只是在寻找有关此方案失败原因的信息。