3

我所使用的大多數語言都不支持遞歸註釋。對遞歸註釋的語言支持

  1. 爲什麼語言設計師會選擇不執行此操作?
  2. 它看似複雜嗎?
  3. 會有不良結果嗎?遞歸評論

例子:

/* 
for (int j = 0; j <= SourceTexture.Height; j += SampleSize) 
{ 
    ... 
} 

// Comment within comment below: 
/*for (int i = 0; i < TextureColour.Length; i++) 
{ 
    ... 
}*/ 


sourceTexture.SetData<Color>(TextureColour); 
*/ 

編輯:據我所知,答案的爭論至今(當你在字符串註釋標記出現問題)。但是,我的困惑的原因是你現在有這個問題。

例如,我知道下面的代碼不會給出預期的結果。

/* 
    char *str = "/* string"; 
    // Are we now 1 level inside a comment or 2 levels? 

*/ 

printf("Hello world"); 

/* 
    char *str2 = "string */"; 
*/ 

但在我心裏,我會在下面的情況沒有什麼不同,以一個意想不到的結果:

/* 
CODE "*/"; 
*/ 

這也將產生一個意想不到/非期望的結果。

所以,雖然它可能是一個遞歸註釋的問題,但我爲什麼不這樣做的理由不這樣做的理由是它已經是非遞歸註釋的問題。作爲一名程序員,我知道編譯器的行爲就像這樣,我也在解決它。我認爲用遞歸註釋來解決同樣的問題並不多。

+0

爲什麼不去閱讀編譯器的介紹性文字,然後回來? – Marcin

+0

我理解編譯器的基礎知識,但實際上只是基礎(因此是這個問題)。對不起,如果它是一個簡單的/應該是顯而易見的。 –

+0

+1因爲我一直很討厭這個。使用現代編輯器,它不再是一個問題(在Visual Studio中,我可以^ KC和一塊文本將被//評論) – xanatos

回答

2

語言設計者爲什麼不選擇 來實現這個嗎?

它使詞法分析更加難以實施。

是它看似複雜嗎?

恕我直言,沒有,但是這是主觀的。

難道有不想要的結果嗎?

很難說。你已經發現,即使是正常的塊註釋可以使問題:

/* print ("*/"); */ 

我知道2種語言有嵌套塊註釋:HaskellFrege

2

我會打一個比方,也許它會更清楚:

/* 
    char *str = "/* string"; 
    // Are we now 1 level inside a comment or 2 levels?  
*/ 

printf("Hello world. Will this be printed? Or is it a comment?"); 

/* 
    char *str2 = "string */"; 
*/ 

你無法分析評論的註釋中沒有解釋什麼是裏面的評論。但是你不能解釋評論裏面的內容,因爲它是評論,所以定義爲「人文」而不是「語言」。

+0

爲了擴大這個範圍:在掃描整個文件(或其他文件單位的輸入),但它需要更復雜的詞法掃描。 – Marcin

+0

@Marcin你可以在另一條評論中的字符串中加入'* /'......我認爲它會變得很複雜。 – xanatos

+0

@Marcin你會如何解析編輯後的代碼示例? :-) – xanatos

0

我相信這只是從來沒有考慮過的開始,隨着事情的發展,它成爲一個「非重要」的特徵。此外,它需要更多的驗證。

示例場景......

MyLang版本1:目的

  • 提供多行留言

開發商:嗯..我知道,每次我找到一個/*我會評論一切,直到下一個*/ - 簡單!

MyLang版本1

1天后...

用戶:呃...我不能做遞歸評論,幫助我。

支持:請保留。

30分鐘後...

支持經理 - >開發者:用戶不能做遞歸評論。

開發商:(什麼是遞歸...)掛在...

30分鐘後

開發者:是的,我們不支持遞歸評論。

1

雖然C的多行註釋不能嵌套,遞歸註釋的效果可以或多或少的在C中使用#if 0 ... #endif實現(我強烈建議您在想要禁用代碼塊時使用它,正是這個原因)。

即使C預處理器,被設計成與帖子一樣愚蠢,完全能夠處理嵌套註釋,就像它必須能夠處理帶有錯誤條件的嵌套#if指令一樣。所以這與任何難以定義或解析的東西並無關係,因爲雖然它使評論更加複雜,但它們仍然不比預處理中的其他事情更復雜。

但是,使用#if 0 ... #endif當然需要在您嘗試排除的代碼中沒有任何不匹配的#endif

根本註釋不能同時的(a)完全非結構化和(b)是遞歸的。無論是偶然還是故意選擇,C都與(a)一起 - 註釋文本除了不包含註釋終止符序列(或三元等價物,如*??/<newline>/)之外,不必遵守任何語法約束。