180 c++ compiler-construction warnings c-preprocessor
在某些C++编译器中出现以下警告的原因是什么?
文件末尾没有换行符
为什么我应该在源/头文件的末尾有一个空行?
TJ *_*oks 212
想想如果没有新行可能会出现的一些问题.根据ANSI标准,#include
开头的文件将文件完全按原样插入到文件的前面,而不是#include <foo.h>
在文件内容之后插入新行.因此,如果您在解析器的末尾包含一个没有换行符的文件,它将被视为最后一行foo.h
与第一行在同一行foo.cpp
.如果foo.h的最后一行是没有换行的注释怎么办?现在第一行foo.cpp
被注释掉了.这些只是可能出现的问题类型的几个例子.
只是想将任何感兴趣的人指向詹姆斯的回答.虽然上述答案对于C仍然是正确的,但新的C++标准(C++ 11)已经更改,因此如果使用C++和符合C++ 11的编译器,则不再发出此警告.
从C++ 11标准到James'帖子:
一个非空的并且不以换行符结尾的源文件,或者在任何此类拼接发生之前以反斜杠字符开头的新行字符结尾的源文件,应该被处理,就像另一个新文件一样 - 行字符被附加到文件中(C++11§2.2/ 1).
Jam*_*lis 42
在C++ 11中删除了每个源文件以非转义换行符结尾的要求.该规范现在为:
一个非空的并且不以换行符结尾的源文件,或者在任何此类拼接发生之前以反斜杠字符开头的新行字符结尾的源文件,应该被处理,就像另一个新文件一样 - 行字符被附加到文件中(C++11§2.2/ 1).
符合标准的编译器不应再发出此警告(至少在C++ 11模式下编译时,如果编译器具有针对语言规范的不同修订版的模式).
Vyt*_*nis 15
"服从"的答案是"因为C++ 03标准说未以新行结尾的程序的行为未定义"(转述).
好奇的答案在这里:http://gcc.gnu.org/ml/gcc/2001-07/msg01120.html.
它不是指空行,而是最后一行(可以包含其中的内容)是否以换行符终止.
大多数文本编辑器会在文件的最后一行末尾添加换行符,因此如果最后一行没有换行符,则存在文件被截断的风险.但是,有充分的理由说明为什么您可能不需要换行符,因此它只是一个警告,而不是错误.