2016-02-11 88 views
-1
/* 
/**hiiii**/ 
*/ 

說我喜歡這樣的評論,那麼這有什麼問題?在開始時,我們有/*,然後在它裏面有一些字符串,最後我們在末尾*/,那麼這裏有什麼錯誤?爲什麼我們不能在另一條評論中嵌套一條評論?

+1

評論停止一旦他們看到* /的匹配結束,如果你想要一個嵌套註釋只是使用//裏面,而不是。 –

+1

要暫時禁用包含註釋的代碼部分,請使用'#if 0'。某些IDE提供的替代方案是一個快捷鍵,它將通過在每行開始處插入一個'//'來將一段代碼轉換爲註釋。 – user3386109

+0

'a = 42; //外部註釋//內部嵌套註釋:)' – pmg

回答

6

C標準是非常明確了。 /*...*/樣式註釋請勿嵌套,因爲語言語法不允許嵌套。

引用C11,章6.4.9,評論,(重點煤礦

除了內的字符常量,字符串文字,或註釋,人物/* 介紹評論。此類評論的內容僅用於識別 多字節字符,並查找終止它的字符*/83)

,並在相關腳註,

83)因此,/* ... */註釋不嵌套。

要詳細描述,當你的情況,

/*     <-- Comments starts here 
/**hiiii**/   <-- Found the ending */, so comment ends. 
*/     <-- problem here.... 
  • 在第一行,/*開始評論。
  • 在第二行起始/*不是開始評論,如前所述。
  • 在第二行結尾處,*/終止註釋。所以,在第三行中,*/會產生錯誤。
+3

這並不回答爲什麼不可以在C中使用嵌套註釋。 –

+0

@VladfromMoscow抱歉,先生,沒有得到你。任何我錯過的東西? –

+0

@VladfromMoscow「因爲」這就是語言的定義方式。這種行爲比C11早了一點;我似乎記得C86以這種方式工作,這在我學習時很新穎。 –

1

/**hiiii**/行末尾的*號正在結束註釋。

這樣做:

/* 
//*Hiiii* 
*/ 
1

看到後/*編譯器尋找*/。一旦它找到更接近*/的評論,就完成了。一切從/*到第一個*/視爲評論。所以,

/* 
/**hiiii**/ 

發表評論。

第二個*/沒有前面的/*,因此會導致錯誤。

4

爲什麼我們不能在另一條評論中嵌套一條評論?

因爲語言設計者對語言實現者感到可惜。

解析不可理解的評論是非常容易的;分析可嵌套的評論不太容易。

// pseudo code for unnestable comments 
is the character a '*'? YES => Is the next one a '/'? YES END COMMENTS 
else STILL INSIDE A COMMENT 
+0

嵌套註釋的僞代碼:'inside_comment = 0; if(「/ *」)inside_comment ++; if(「* /」)inside_comment - ;'所以零值意味着你不在評論中,正值表示你在評論中,而負值是錯誤。 – user3386109

+1

@ user3386109:我沒有說這很難:) – pmg

1

代碼可以有效嵌套評論的行爲與#if 0。因此不需要延伸/* */行爲。

#if 0 

    blah blah 

#if 0 
    blah blah 

#endif 

    blah blah 

#endif 
0

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來嵌套並且容易地將取消註釋

  • 插入//在塊中的每一行的開頭。這可能是嵌套,是感覺,你可以評論再次在每一行的開頭插入//較大的塊。