是不是有语法错误?应该是printf("一个",两个和""%s.\n","三个"); 是有效的代码?

jru*_*uiz 2 c syntax gcc string-literals c-preprocessor

看看这段代码:

#include <stdio.h>

#define _ONE "one"
#define _TWO_AND ", two and "
int main()
{
    const char THREE[6] = "three" ;
    printf(_ONE _TWO_AND "%s.\n", THREE );
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

printf是有效的:

printf("one" ", two and " "%s.\n", "three" );
Run Code Online (Sandbox Code Playgroud)

输出是:

一,二,三.

gcc编译此代码后既没有错误也没有警告消息.gcc编译器是否应该以这种方式工作,还是一个bug?

Sha*_*our 10

这是标准行为,如果我们查看C99草案标准部分,相邻的字符串文字会连接在一起5.1.1.2 翻译阶段6段说:

相邻的字符串文字标记是连接的

gcc确实有许多非标准的扩展,但是如果你构建使用-pedantic那么gcc应该警告你,如果它做了非标准的事情,你可以在文档部分扩展到C语言系列中阅读更多内容.

理由在" 国际标准 - 编程语言的基本原理 - C"中有所说明,并在" 6.4.5 字符串文字"一节中说明:

通过使用反斜杠换行符续行,可以在多行中继续字符串,但这要求字符串的延续在下一行的第一个位置开始.为了允许更灵活的布局,并解决一些预处理问题(见§6.10.3),C89委员会引入了字符串文字串联.将一行中的两个字符串文字粘贴在一起,中间没有空字符,以构成一个组合字符串文字.对C语言的这种添加允许程序员将字符串文字扩展到物理行的末尾之外,而不必使用反斜杠换行机制,从而破坏程序的缩进方案.未引入显式连接运算符,因为连接是词法构造而不是运行时操作.