行尾(GNU文档)

时间:2015-12-19 17:43:09

标签: c gcc

我正在阅读有关gcc预处理的文档,我读了下面的句子(here):

  

如果任何输入文件的最后一行缺少行尾标记,则认为文件末尾隐式提供一个。 C标准表示这种情况会引发未定义的行为,因此GCC会发出警告信息。

我尝试通过以下方式产生警告:

> echo -n "int main(void) {return 0;}" > test.c
> gcc -Wall -Wextra -Werror test.c

但没有概率,它编译。我将行尾标记理解为新行字符,但它似乎是其他任何东西。

我怎样才能发出警告?

2 个答案:

答案 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 不需要对未定义的行为发出任何诊断。