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

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

文件结尾没有换行符

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

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

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

通过James的post从C ++ 11标准:

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

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

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

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

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

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

“服从”的答案是“因为C ++ 03标准说明程序的行为不是以换行符结尾是不确定的”(转述)。

好奇的答案在这里: http : //gcc.gnu.org/ml/gcc/2001-07/msg01120.html 。

它不是指空白行,而是最后一行(可以有内容)以换行符结束。

大多数文本编辑器会在文件的最后一行的末尾放置一个换行符,因此如果最后一行没有,可能会导致文件被截断。 然而,为什么你可能不需要换行符,这是有道理的,所以这只是一个警告,而不是一个错误。

#include将用文件的文字内容replace它的行。 如果文件不以换行符结尾,则包含将其拉入的#include行将与下一行合并。

我正在使用c-free IDE版本5.0,在我的程序中使用'c ++'或'c'语言时,我遇到了同样的问题。只是在程序的末尾,即程序的最后一行(在函数的大括号之后,它可能是主要或任何function), 按enter -line no。 将增加1.然后执行相同的程序,它将运行没有错误。

当然,实际上每个编译器在#include之后添加一个新行。 值得庆幸的。 – @mxcl

不是特定的C / C ++,而是一个C方言:当使用GL_ARB_shading_language_include扩展时,OS X上的glsl编译器会警告你没有关于缺失的换行符。 所以你可以编写一个MyHeader.h文件,头文件以#endif // __MY_HEADER_H__结尾, #endif // __MY_HEADER_H__ 丢失#include "MyHeader.h"后的行。

由于C / C ++版本之间的行为不同,如果文件不以换行符结束。 特别讨厌的是旧的C ++版本,fx在C ++ 03标准中说的(翻译阶段):

如果非空的源文件不是以换行符结尾,或者以紧跟在反斜杠字符后面的换行符结束,则行为是未定义的。

未定义的行为是不好的:一个符合标准的编译器可以做或多或less的东西在这里(插入恶意代码或其他)显然是一个警告的理由。

尽pipe在C ++ 11中情况更好,但避免在早期版本中未定义行为的情况是一个好主意。 C ++ 03规范比C99更糟糕,它完全禁止这样的文件(行为被定义)。

此警告也可能有助于指出某个文件可能已被截断。 确实,编译器可能会抛出一个编译器错误 – 尤其是如果它在函数的中间 – 或者可能是一个链接器错误,但是这些可能会更加隐晦,并且不能保证发生。

当然,如果文件在换行符后立即被截断,这个警告也是不能保证的,但是它仍然可以捕捉到其他错误可能会丢失的情况,并且给出了更强的提示。

这不是一件好事。 对我而言,我在Windows 7下的Dev C ++中工作,有相同的警告消息。 我只是在我的代码后面放了一个新行(只需点击回车键),警告就消失了。 任何方式不会影响程序运行或编译。

最后添加一个新行

这不是一个错误。 这只是一个警告。

在编辑器中打开文件,转到文件的最后一行,然后按回车键在文件末尾添加一个空行。

但是,除此之外,您应该使用#include <iostream>而不是<iostream.h> 。 然后把一个using std::cout; 之后。