C90只有一種注釋風格,就是使用“/*”和“*/”。早在預處理階段,C預處理器就會剔除所有出現在“/*”和“*/”之間的內容(包括這對記號本身),所以在接下來傳送到C編譯器的代碼文件里是不會出現任何注釋內容的。
但這么簡單的注釋風格有時也會令人頭疼。例如,你可能想,什么是注釋呢?注釋就是寫什么東西都無所謂,反正編譯器不會看到這些東西。很不幸,C預處理器一般都不支持嵌套注釋,如果你這樣寫:
/*something /* something else */*/
是行不通的。因為預處理器在碰到第一個“*/”時就認為注釋已經結束!于是它把到這里為止的注釋移除,可想而知,結果留下孤零零一個“*/”—編譯程序又報錯了。
這樣的處理常常令我們很不舒服,例如有時我們調試代碼,需要把連續幾行代碼注釋掉觀察結果,做法自然是這樣寫:
語句1;
語句2;
/*
語句3;
*/
語句4;
語句5;
但隨著調試的深入,可能我們想連語句2、語句4都注釋掉:
語句1;
/*
語句2;
/*
語句3;
*/
語句4;
*/
語句5;
多加一對注釋不就解決了?
--中招了。看,你用了嵌套注釋。
為了解決這個問題,C++引入另一種風格的注釋:使用“//”。預處理器會刪除從“//”開始到后面碰到的第一個換行符之間的所有內容。這樣就沒有嵌套注釋的問題了,只不過書寫有點繁瑣,例如:
語句1;
//語句2;
//語句3;
//語句4;
語句5;
你喜歡注釋哪一行都可以,隨時可以撤消注釋,干脆利落,絕對沒有副作用,當然,前提是你一行只寫一個語句。
資深程序員一般都更樂意使用C++風格的注釋,我也如此建議。不過,你會問,C預處理器可不認識“//”啊?
其實多數C預處理器都“暗中”支持“//”,除非你使用“嚴格符合C90”之類的編譯選項,否則C預處理器是不會阻撓你的。
而且,有個好消息:
C99已經正式采納C++的注釋風格,在今后,你可以光明正大的使用“//”。當然,原來的老風格仍然可以繼續使用。
不過,大家最好不要“一只腳踏兩只船”,像這樣就不好:
// /* 語句1;
語句2;
*/
語句3;
原先用“/*”和“*/”注釋掉語句1和語句2,現在不小心又加上“//”,出錯了。因為預處理器一看見“//”就不管三七二十一把“///* 語句1;”全部刪除掉,結果又留下一個“*/”沒有處理。
結束本節之前,再討論一個有趣的問題。
有些敏感的讀者已經坐不住了:那萬一我想在字符串里包含“//”之類的注釋符怎么辦?譬如我要在屏幕上顯示這么一行:
we have a // in this line.
能夠這樣寫嗎:
printf(“we have a // in this line.\n”);
答案是可以的,只要記住三條原則:
#1 字符串里面的注釋符不起注釋作用;
#2 注釋符里的雙引號不起標識字符串的作用;
#3 如果情況混亂則從頭找起。
例如:
printf(“we have /* and */ here.”);
則根據原則#1,最后打印出來的字符串不會缺少“/* and */”這部分。
// “This line is a comment.”
由原則#2,可以肯定這一行會被注釋掉。
/* “ */ “ */
你可能這樣想,第一個“*/”在雙引號里面,噢,它不起注釋作用,所以這一行被完全注釋掉。
不是的。在這么“惡劣”的環境下,我們要找出最先出現的符號是注釋符還是雙引號,在這個例子里,注釋符最先帶頭,所以根據原則#2,雙引號不起任何作用,當預處理器碰到第一個“*/”時就認為注釋結束,預處理的結果是上面這一行語句最后剩下:
“ */
另:
其實C/C++程序員可以使用預處理指令實現嵌套注釋:
語句1;
#if 0
語句2;
#if 0
語句3;
#endif
語句4;
#endif
語句5;
因為預處理器在分析預處理指令時不僅進行詞法分析,還進行語法分析,這就比使用“/*”和“*/”高級,后者僅僅涉及詞法分析。
http://blog.chinaunix.net/u/6776/showart_137988.html