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语言的这种添加允许程序员将字符串文字扩展到物理行的末尾之外,而不必使用反斜杠换行机制,从而破坏程序的缩进方案.未引入显式连接运算符,因为连接是词法构造而不是运行时操作.
| 归档时间: |
|
| 查看次数: |
208 次 |
| 最近记录: |