"没有newline at end的文件"编译器的警告
-
09-06-2019 - |
题
什么的原因是,为以下警告,在某些C++编译器?
没有newline at end的文件
为什么我应该有一个空行结束时的一个源/头文件?
解决方案
认为的一些可能出现的问题,如果没有换行。根据ANSI标准的 #include
文件的开头插入的文件正是因为它是以前的文件,并且不会插入新的线后 #include <foo.h>
后述内容的文件。所以如果包括一个文件没有newline在最后分析程序,它将被视为如果最后一行的 foo.h
是在同一线路作为第一线的 foo.cpp
.如果最后一行的foo。h是一个评论没有新的线?现在第一行的 foo.cpp
是的评论。这些只是几个例子的问题类型,可以攀升。
只是想要点任何感兴趣的缔约方,对詹姆斯的答复如下。虽然上述答案仍然是正确的对C,新C++的标准(C++11)已经改变,因此,这个警告不应再发出的,如果使用C++编译器符合C++11.
从C++11标准通过詹姆斯的员额:
来源文件,该文件不是空的,并没有结束,一个新的行符,或者结束在一个新的字符,即前面一个反斜杠字之前任何这样的拼接的需要的地方,应当加以处理,如果一个额外的新的行符附的文件(C++11§2.2/1).
其他提示
要求每一来源文件的结束与非逃newline除在C++11.该说明现行文如下:
来源文件,该文件不是空的,并没有结束,一个新的行符,或者结束在一个新的字符,即前面一个反斜杠字之前任何这样的拼接的需要的地方,应当加以处理,如果一个额外的新的行符附的文件(C++11§2.2/1).
一个符合编译器应不再是问题,这个警告(至少不当编制在C++11模式,如果编译器有模式的不同版本的语言规范)。
C++03标准[2.1.1.2]宣布:
...如果来源文件,该文件不是空的不端行符,或者结束在一个新的线性格 立即前面一个反斜杠字之前任何这样的拼接的需要的地方,行为是不确定的。
回答为"服从"是",因为C++03标准说该行为的程序不结尾的行为不确定"(解释).
它不是参照一个空行,这是否是最后一行(可能有内容)终止与一个新行。
大多数文本编辑器会把一行末尾的最后一个文件,因此,如果最后一行中没有一个,还有一种风险,该文件已被截断。然而,有效的原因,你可能不想行使它仅仅是一个警告,而不是一个错误。
#include
将代替其行文字内容的文件。如果文件并没有结束,一个新行,路线包含 #include
拉它在将合并与下一个线。
我使用的c-免费IDE5.0版,在我progrm的'c++'或'c'的语言我得到相同的问题。只是 在节目的结尾 即最后一行的程序(后括号中的功能,它可能是主要的或任何功能),按客行没有。将增加1。然后,执行同样的程序,它将运行不错。
当然在实践中的每一个编译器增加了一个新的线后#包括。谢天谢地。–@mxcl
没有具体C/C++但一C的方言当使用 GL_ARB_shading_language_include
扩展的glsl编译器在OS X警告你 不 关于一个失踪的新行。所以你可以写 MyHeader.h
文件头的警卫结束 #endif // __MY_HEADER_H__
和你 将 失去线后 #include "MyHeader.h"
肯定的。
因为该行为的不同之处之间C/C++版本,如果文件并没有结束,新的线.特别是讨厌的是老年C++版本,外汇C++03该标准说:(翻译阶段):
如果来源文件,该文件不是空的不端在一个新的线 符,或者结束在一个新的字符,即前面一个 反斜杠,行为是不确定的。
不确定的行为是不良:一标准符合编译器可以做更多或更少它想要什么在这里(插入malicous代码或是什么)--显然因为警告。
虽然情况最好是用C++11这是一个好主意,以避免的情况下,行为是不确定的在早期版本。C++03规范比C99其彻底禁止这样的文件(行为是那么定义)。
这一警告也可能有助于表明这一文件可能已被截断。这是真的,编译器可能会扔一个编译错误,无论如何,尤其是如果它是在中间的一个函数或者一个接头的错误,但是这些可能更加隐秘,并不能保证会发生。
当然,这一警告也不能保证如果该文件被截断之后立即有一个空行,但它仍然可以抓住一些情况下,其他问题可能会错过,并提供了一个更强大的提示的问题。
这不是一个错误。这只是一个警告。
打开文件的编辑,去最后一行中的文件,并击中了该添加一个空行,以结束该文件。
虽然,除此之外,你应该使用 #include <iostream>
而不是的 <iostream.h>
.然后把一个 using std::cout;
之后。