將一個只用到標準庫函數的 C 程序在 Windows 平臺上用 VS 2010 編譯,沒有出任何問題。再將它放到 64 位 CentOS 6.8 下,用 GCC 編譯它,接收到一大堆警告和錯誤報告,如下圖:
其中大部分是“null character(s) ignored”警告,還有一些像stray '***' 這樣的錯誤。經過調查發現,原因在于在 Windows 平臺上用文本編輯器保存這個 C 程序時,因為在其中用中文寫了一些注釋,保存時將編碼設置為了 UNICODE,但是 GCC 編譯器不能識別 UNICODE 編碼格式的源文件,就會產生如上圖所示的警告和錯誤。(注意: UNICODE 本身是一個很大的概念,包含 UTF-8、UTF-16、UTF32。但 Windows 平臺上的 UNICODE 實質上是指 UTF-16 編碼,linux 平臺上通常采用 UTF-8 編碼。)
由于只是想讓這個 C 程序在 CentOS 6.8 上能執行,并不需要在 Linux 下編輯它,所以最簡單的解決方法就是在 Windows 平臺上用文本編輯器(比如 Notepad、Notepad++ 等)將這個 C 程序的源文件轉換成 ASCII 編碼或 UTF-8 編碼。從 Windows 7 開始,自帶的記事本 Notepad 在“另存為”時都允許用戶選擇編碼方式。如下圖所示:
于是只需用記事本將原來的 C 程序另外保存一份,編碼選擇 ASNI 或 UTF-8 都可以,接下來將新保存的文件拿到 CentOS 6.8 下用 GCC 編譯。此時程序就能順利地被編譯,GCC 不再報告警告和錯誤了。
Windows 下的 Visual Studio 能夠很好地自動識別源程序的編碼方式,經過實驗后發現:將上面的 C 程序文件以 ANSI、Unicode、Unicode big endian、UTF-8 四種編碼方式分別保存,在 VS 2010 中分別編譯,都能夠成功編譯,不會像 GCC 那樣產生警告和錯誤。
新聞熱點
疑難解答