“文件末尾没有换行符”编译器警告

在一些C ++编译器中出现以下警告的原因是什么?

文件结尾处没有换行符

为什么我应该在源代码/头文件的末尾有一个空行?


想想如果没有换行符可能会发生的一些问题。 根据ANSI标准,开头文件的#include将文件完全插入文件的前部,并且不会在文件内容后面的#include <foo.h>之后插入新行。 所以如果你在解析器的末尾包含一个没有换行符的文件,它将被看作是foo.h的最后一行和foo.cpp的第一行在同一行上。 如果foo.h的最后一行是没有新行的评论呢? 现在foo.cpp的第一行被注释掉了。 这些只是几个可能出现的问题的例子。

编辑 :只是想指出任何感兴趣的各方詹姆斯的答案如下。 虽然上面的答案对C来说仍然是正确的,但是新的C ++标准(C ++ 11)已经被更改,因此如果使用C ++和C ++ 11一致性编译器,则不应再发出此警告。

通过James的帖子从C ++ 11标准:

如果源文件不是空的,并且不以换行符结尾,或以任何此类拼接发生之前立即以反斜线字符开头的换行符结尾的源文件,行字符被附加到文件(C ++ 11§2.2/ 1)。


在C ++ 11中删除每个源文件以非转义换行符结尾的要求。 该规范现在读取:

如果源文件不是空的,并且不以换行符结尾,或以任何此类拼接发生之前立即以反斜线字符开头的换行符结尾的源文件,行字符被附加到文件(C ++ 11§2.2/ 1)。

符合标准的编译器不应该再发出这个警告(至少在C ++ 11模式下编译时,如果编译器具有对语言规范的不同修订版的模式)。


C ++ 03标准[2.1.1.2]声明:

...如果非空的源文件不是以换行符结束,或者以任何此类拼接发生之前立即以反斜线字符开头的换行符结束,则行为未定义。

链接地址: http://www.djcxy.com/p/77237.html

上一篇: "No newline at end of file" compiler warning

下一篇: Why do I need vim in binary mode for 'noeol' to work?