我正在阅读有关gcc预处理的文档,我读了下面的句子(here):
如果任何输入文件的最后一行缺少行尾标记,则认为文件末尾隐式提供一个。 C标准表示这种情况会引发未定义的行为,因此GCC会发出警告信息。
我尝试通过以下方式产生警告:
> echo -n "int main(void) {return 0;}" > test.c
> gcc -Wall -Wextra -Werror test.c
但没有概率,它编译。我将行尾标记理解为新行字符,但它似乎是其他任何东西。
我怎样才能发出警告?
答案 0 :(得分:5)
它似乎已从gcc中移除。
看到这个: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=14331#c19
2007-05-31
PR preprocessor/14331 * lex.c (_cpp_get_fresh_line): Don't warn if no newline at EOF.
答案 1 :(得分:1)
C11(N1570),§5.1.1.2,声明:
非空的源文件应以换行符结尾, 它不应该立即以反斜杠字符开头 在任何这样的拼接发生之前。
因此,没有文件的换行符违反了上述“应该”约束。
clang
警告它:
$ printf "int main(void) {return 0;}" > test.c
$ clang -Weverything test.c
test.c:1:27: warning: no newline at end of file [-Wnewline-eof]
int main(void) {return 0;}
^
1 warning generated.
但违反约束的行为是undefined behaviour。
C11(N1570),§4,声明:
如果''''或'''''''要求出现在a。之外 违反约束或运行时约束,行为是 未定义。此处另有说明未定义的行为 国际标准用''未定义的行为''或由 省略任何明确的行为定义。没有 这三者之间的重点不同;他们都描述了''行为 这是未定义的''。
因此,gcc冒昧地取消警告(如@nnn所述),因为gcc 不需要对未定义的行为发出任何诊断。