KEIL編程時遇到的常見錯誤
2014 北京海淀區 張俊浩
1.warning: #1-D: last line of file ends without a newline
爲什麼 C 語言源程序最後一行要是一個空行?否則的話編譯器會報warning: #1-D: last line of file ends without a newline這種錯誤,雖然這個warning沒啥影響,但既然要設計這麼一個warning總得有點原因吧。(2014-11-20)
C 語言是在 Unix 中發明的,爲 Unix 系統的編程語言,它對文件的處理遵循一個基本的原則:文件是流式的,可以被任意的拼接並且拼接後仍然保證完整性。
爲了保證這一點,在 Unix 中 \n 符號被定義爲一行的『結束符』,換句話說,如果一行的結尾沒有 \n 視爲這一行沒有結束,換句話說這個文件不完整,也就是說這根本不是一個合法的文本文件。(題外話:同時爲了保證這一點,Unix 文本通常不允許使用 BOM,因爲 BOM 拼接之後將出現在字符流的中間位置,無法有效的定義其處理方法。)
在 Windows 中,微軟把 \n 定義爲兩行之間的『分隔符』而非結束符,所以 Unix 文件結尾的 \n ,在 Windows 看起來就是一個空行,而這一個空行在 Unix 中並不存在,如果你使用 Vim 之類的文本編輯器,會根本看不到最後這個空行。
不遵守標準會帶來的問題是:如果 \n 是兩行之間的分隔符,那麼最後一行不帶 \n,結果是拼接兩個文件時,後一個文件的第一行就會被拼到前一個文件的最後一行,這很可能會造成語意錯誤。
比較常見的例子是:前一個文件最後一行是 } 後一個文件第一行是 #include,如果 } 後面沒有結束符,拼接之後就成了 }#include ,立即發生語法錯誤。