C語言的註釋

在C/C++語言中,
在對源文件作預處理的時候,有兩條基本原則:
一、凡是以//開頭的爲單行註釋
二、凡是以\結尾的表明此行還沒有結束
因而預處理器在處理的時候會先按第二條規則,看每行的末尾的那個 字符是否是」\」,是的話,就下一行接到本行。而後把全部 以//開頭的註釋/* */的塊註釋去掉。
可是存在一個問題,入下:
對於big5中的漢字而言,其第一個字節的編碼範圍是0xA1 - 0xFE,第二個字節是0x40 - 0xFE。而’\'的ASCII碼是0x5c,這就意味着:凡是以big5編碼的文件,若是gcc沒有正確的認爲它的 源文件的編碼是big5,那麼就可能出現由於 單行註釋末尾是漢字,而把下行的代碼吃掉的狀況。這樣是很危險的,可是gcc會給出一個警告:」warning: multi-line comment In file」。這樣的問題在gbk中一樣存在。
將下面的代碼php

// 你好\
int main(int argc, char* argv[])
{
    return 0;
}

以gbk的方式保存,並採用gcc 3.4編譯。
不管是solaris 8仍是freebsd 6.2,不管shell的locale的設置是 zh_CN.GBK仍是 zh_CN.UTF-8,所獲得的錯誤都是相同的。
$ gcc -c testgbk.cpp
testgbk.cpp:5: error: expected unqualified-id before 「return」
testgbk.cpp:6: error: expected declaration before ‘}’ token
g++ 3.3下顯示:
shell

testgbk.cpp:3: error: parse error before `return’ide

截圖以下:測試

緣由很簡單,我把「好」字的GBK編碼的後 半個 (?)字節改爲了’\'的編碼,從而獲得了」篭」字。
gcc發現’\'後面接着的就是’\n’,故而把下一行」int main(int argc, char* argv[])」也當作註釋一併刪除掉了。按gcc 3.4的man頁,gcc會根據shell的locale設置來 猜想 源文件的編碼格式,不然它會把其看成utf-8來處理。可是據我在Freebsd和solaris系統中的觀察,gcc 3.4並無根據 環境變量來猜想源文件的編碼。
編碼

一個不錯的解決方案是:強行給gcc添加-finput-charset=big5這樣的參數,來解決此問題。相似的還有-fexec-charset,-fwide-exec-charset用於指定執行環境的編碼。可是不幸的是,gcc內部的處理都是基於utf-8的,且其轉換工做通常是靠系統的iconv轉碼庫來完成的。 因此係統庫必須提供 GBK<-> UTF-8 、BIG5 <-> UTF-8 的編碼。spa

例如,我在Freebsd 6.2下使用這樣的參數編譯一個測試文件:
$ gcc -c testbig5.cpp -finput-charset=big5 -fexec-charset=big5 -fwide-exec-charset=big5
所獲得的輸出是:
cc1plus: no iconv implementation, cannot convert from big5 to UTF-8
cc1plus: no iconv implementation, cannot convert from UTF-8 to big5
cc1plus: no iconv implementation, cannot convert from UTF-8 to big5
因此這種方案的缺點是:
一、缺少通用性,缺少可移植性。
Freebsd的內核中的轉碼是靠查一個16位的表,因此沒法處理utf-8中的漢字(由於漢字是3字節),而直到最新的,要到08才能發佈的Freebsd 7.x,此問題也依然沒有被解決。而Solaris最初的代碼是基於BSD的。它所提供的iconv轉碼功能也很是差。
二、添加了不少額外的轉碼操做。
目前,utf-8(unicode)還沒有徹底容納GBK、big5的所有字符。不少字符是轉換不過去的。
另外一個折衷的方案是:保證每行註釋都以句號或者空格結尾。
缺點是,須要檢查並改動不少文件。並且,特殊漢字依然有可能出如今源文件的常量字符串中。問題依舊。
例如:
const char* s=」你篭」;
寫成這樣的怪樣子就能夠編譯了:
const char* s=」你篭」";
較好的解決方案是源文件都以UTF-8格式編碼。這樣能夠最大限度的減小轉碼次數。最完全的解決方案是引入gettext,不在源文件中存儲漢字常量字符串。改用單獨的文件存儲。目前包括不少php論壇、blog都已採用這種方案。可是這樣作原本是爲了支持英、法、漢多語言,解決翻譯的問題。若是單爲了簡、繁的問題就這麼作,代價太大。翻譯

相關文章
相關標籤/搜索