標籤:

為什麼 C 語言源程序最後一行要是一個空行?

否則的話編譯器會報warning: #1-D: last line of file ends without a newline這種錯誤,雖然這個warning沒啥影響,但既然要設計這麼一個warning總得有點原因吧。


C 語言是在 Unix 中發明的,為 Unix 系統的編程語言,它對文件的處理遵循一個基本的原則:

文件是流式的,可以被任意的拼接並且拼接後仍然保證完整性。

為了保證這一點,在 Unix 中
符號被定義為一行的『結束符』,換句話說,如果一行的結尾沒有
視為這一行沒有結束,換句話說這個文件不完整,也就是說這根本不是一個合法的文本文件。

(題外話:同時為了保證這一點,Unix 文本通常不允許使用 BOM,因為 BOM 拼接之後將出現在字元流的中間位置,無法有效的定義其處理方法。)

在 Windows 中,微軟把
定義為兩行之間的『分隔符』而非結束符,所以 Unix 文件結尾的
,在 Windows 看起來就是一個空行,而這一個空行在 Unix 中並不存在,如果你使用 Vim 之類的文本編輯器,會根本看不到最後這個空行。

不遵守標準會帶來的問題是:如果
是兩行之間的分隔符,那麼最後一行不帶
,結果是拼接兩個文件時,後一個文件的第一行就會被拼到前一個文件的最後一行,這很可能會造成語意錯誤。

比較常見的例子是:

前一個文件最後一行是 } 後一個文件第一行是 #include,如果 } 後面沒有結束符,拼接之後就成了 }#include ,立即發生語法錯誤。


為什麼不google一下呢。

http://gcc.gnu.org/ml/gcc/2001-07/msg01120.html


我記得MASM 2.X版也有類似問題,5.X版就沒了。


你的編譯器版本太老了,新版的沒有這個問題


其實沒什麼的,但提示這個有3個原因:

  1. c語言規範里要求的,文件結尾要是空行, 但實際上,各個編譯器在實現的時候,就算沒有空行也能夠處理,不過為了忠於規範,編譯器還是給出了這個提示
  2. 不能保證所有編譯器實現都像1裡面描述的那麼貼心,萬一有嚴格遵守規範的編譯器實現,那麼這就會出錯
  3. 也是最重要的,c源文件在#include其它文件的時候,如果被include的那個文件結尾沒有空行會怎樣?如果編譯器實現不夠人性化,很可能「被include的文件的最後一行和當前文件的第一行並為一行」,這多半會導致一些錯誤的;當然,大多數預處理程序都會自動將#include進來的文件加上換行符,不過還是給你個提示,提醒你一下


你試著用vim給沒有結尾空行的文件添加文字。。。。。。。。。

我……


猜測原因,如果最後一行不是空行的話,假設最後一行內容為:

A

在其後添加一行:

A(換行符)

B

如果中間空一行,是不是就容易比較?


對於我來說,是因為gcc要發出警告,我又不喜歡看見警告,那就滿足他的要求多一個空行吧。


推薦閱讀:

如何以最小的改動盡量不改變已有代碼的情況下適應不斷變更的需求?
如果要改進C語言,您最希望添加哪些語言特性,移除哪些語言特性?
在知乎這個平台里,你最喜歡哪位C/C++大神?
不調用畫圖 API,用C 或 C++ 如何實現畫一條線?
編程時間一萬小時之後可以達到怎樣的水平?

TAG:C編程語言 | CC |