/*
/**hiiii**/
*/
說我喜歡這樣的評論,那麼這有什麼問題?在開始時,我們有/*
,然後在它裏面有一些字符串,最後我們在末尾*/
,那麼這裏有什麼錯誤?爲什麼我們不能在另一條評論中嵌套一條評論?
/*
/**hiiii**/
*/
說我喜歡這樣的評論,那麼這有什麼問題?在開始時,我們有/*
,然後在它裏面有一些字符串,最後我們在末尾*/
,那麼這裏有什麼錯誤?爲什麼我們不能在另一條評論中嵌套一條評論?
C標準是非常明確了。 /*...*/
樣式註釋請勿嵌套,因爲語言語法不允許嵌套。
引用C11
,章6.4.9,評論,(重點煤礦)
除了內的字符常量,字符串文字,或註釋,人物
/*
介紹評論。此類評論的內容僅用於識別 多字節字符,並查找終止它的字符*/
。83)
,並在相關腳註,
83)因此,
/* ... */
註釋不嵌套。
要詳細描述,當你的情況,
/* <-- Comments starts here
/**hiiii**/ <-- Found the ending */, so comment ends.
*/ <-- problem here....
/*
開始評論。/*
不是開始新評論,如前所述。*/
終止註釋。所以,在第三行中,*/
會產生錯誤。這並不回答爲什麼不可以在C中使用嵌套註釋。 –
@VladfromMoscow抱歉,先生,沒有得到你。任何我錯過的東西? –
@VladfromMoscow「因爲」這就是語言的定義方式。這種行爲比C11早了一點;我似乎記得C86以這種方式工作,這在我學習時很新穎。 –
/**hiiii**/
行末尾的*號正在結束註釋。
這樣做:
/*
//*Hiiii*
*/
看到後/*
編譯器尋找*/
。一旦它找到更接近*/
的評論,就完成了。一切從/*
到第一個*/
視爲評論。所以,
/*
/**hiiii**/
發表評論。
第二個*/
沒有前面的/*
,因此會導致錯誤。
爲什麼我們不能在另一條評論中嵌套一條評論?
因爲語言設計者對語言實現者感到可惜。
解析不可理解的評論是非常容易的;分析可嵌套的評論不太容易。
// pseudo code for unnestable comments
is the character a '*'? YES => Is the next one a '/'? YES END COMMENTS
else STILL INSIDE A COMMENT
嵌套註釋的僞代碼:'inside_comment = 0; if(「/ *」)inside_comment ++; if(「* /」)inside_comment - ;'所以零值意味着你不在評論中,正值表示你在評論中,而負值是錯誤。 – user3386109
@ user3386109:我沒有說這很難:) – pmg
代碼可以有效嵌套評論的行爲與#if 0
。因此不需要延伸/* */
行爲。
#if 0
blah blah
#if 0
blah blah
#endif
blah blah
#endif
C意見介紹/*
不要嵌套。這個決定是由40多年前的原始設計師做出的,所有C標準都強制要求這樣做。儘管一些較早的編譯器支持使用命令行開關嵌套這些註釋,但強烈建議遵守標準實踐並考慮在第一次出現字符*/
時註釋結束。
注意/
和*
可以通過一個轉義換行符(一\
後跟一個換行符分開:
int i = 3; /\
* This is a comment (SO syntax coloring is not perfect ;-) *\
/printf("%d\n", i); // prints 3
另外請注意,這是一個壞主意,通過將其與/*
評論發表評論代碼*/
如果你的代碼中包含C註釋,這將失敗,甚至可能失敗默默:
int i = 3, j = 6;
/* printf("debug: i=%d\n", i); /* check the value of i */
printf("debug: j=%d\n", j); // check the value of j */
在上面的代碼,第二printf
不是已評論。
你可以想像更棘手的情況:
/*
// list all C source files in subdirectories
system("ls */*.[ch]");
*/
有發表意見的代碼塊中的兩個有效途徑:
使用#if 0
/#endif
預處理指令。這些可以通過將#if 0
更改爲#if 1
來嵌套並且容易地將取消註釋。
插入//
在塊中的每一行的開頭。這可能是嵌套,是感覺,你可以評論再次在每一行的開頭插入//
較大的塊。
評論停止一旦他們看到* /的匹配結束,如果你想要一個嵌套註釋只是使用//裏面,而不是。 –
要暫時禁用包含註釋的代碼部分,請使用'#if 0'。某些IDE提供的替代方案是一個快捷鍵,它將通過在每行開始處插入一個'//'來將一段代碼轉換爲註釋。 – user3386109
'a = 42; //外部註釋//內部嵌套註釋:)' – pmg