想想如果沒有換行符,可能發生的一些問題。 根據ANSI标準,開頭檔案的#include将檔案完全插入到檔案的前面,并且不會在檔案内容之後的#include 之後插入新行。 是以如果你在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 ++中工作,有相同的警告消息。 我隻是在我的代碼後面放了一個新行(隻需點選Enter鍵),警告就消失了。 任何方式不會影響程式運作或編譯。

這不是一個錯誤。 這隻是一個警告。
在編輯器中打開檔案,轉到檔案的最後一行,然後按Enter鍵在檔案末尾添加一個空行。
但是,除此之外,您應該使用#include 而不是 。 然後把一個using std::cout; 之後。