c语言的单行注释范围,c语言中的注释,multi-line comment
在C/C++語言中,
在對源文件做預處理的時候,有兩條基本原則:
1、凡是以//開頭的為單行注釋
2、凡是以\結尾的代表此行尚未結束
于是預處理器在處理的時候會先按第二條規則,看每行的末尾的那個字符是不是”\”,是的
話,就下一行接到本行。
然后把所有以//開頭的注釋和/* */的塊注釋去掉。
但是存在一個問題,
對于big5中的漢字而言,其第一個字節的編碼范圍是0xA1 - 0xFE,第二個字節是0×40 -
0xFE。而’\'的ASCII碼是0×5c.這就意味這,凡是以big5編碼的文件,如果gcc沒有正確的
認為它源文件的編碼是big5,那么就可能出現因為單行注釋末尾是漢字,而把下行的代碼
吃掉的情況。這樣是很危險的,但是gcc會給出一個警告:”warning: multi-line
comment In file”
這樣的問題在gbk中同樣存在。
將下面的代碼
—————————————————————————–
//你篭
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下顯示:
testgbk.cpp:3: error: parse error before `return’
原因很簡單,我把“好”字的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 的編碼.
例如,我在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
所以這種方案的缺點是
1、缺乏通用性,缺乏可移植性。
Freebsd的內核中的轉碼是靠查一個16位的表,所以無法處理utf-8中的漢字(因為漢字是3
字節),而直到最新的,要到08才能發布的Freebsd 7.x,此問題也依然沒有被解決。
而Solaris最初的代碼是基于BSD的。它所提供的iconv轉碼功能也非常差。
2、添加了很多額外的轉碼操作。
目前,utf-8(unicode)尚未完全容納GBK、big5的全部字符。很多字符是轉換不過去的。
另一個折衷的方案是:保證每行注釋都以句號或者空格結尾。
缺點是,需要檢查并改動很多文件。
且,特殊漢字依然有可能出現在源文件的常量字符串中。問題依舊。
例如
const char* s=”你篭”;
寫成這樣的怪樣子就可以編譯了:
const char* s=”你篭”";
較好的解決方案是源文件都以UTF-8格式編碼。這樣可以最大限度的減少轉碼次數。
最徹底的解決方案是引入gettext,不在源文件中存儲漢字的常量字符串。改用單獨的文件
存儲。目前包括很多php論壇、blog都已采用這種方案。但是這樣做本來是為了支持英、
法、漢多語言,解決翻譯的問題。如果單為了簡、繁的問題就這么做,代價太大。
總結
以上是生活随笔為你收集整理的c语言的单行注释范围,c语言中的注释,multi-line comment的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux基础磁盘管理,Linux基础入
- 下一篇: 手机电脑自适应导航源码php,自适应各终