2013-03-28 31 views
2

通常,如果一個*/(塊註釋閉合)存在於代碼沒有/*(塊註釋開口),編譯器產生錯誤。解釋爲什麼代碼編譯成功

但是,爲什麼編譯產生在以下情況下的錯誤?從一開始

/* 
#ifdef abcd 
printf("what ever it is"); 
#endif */ 

您刪除了「/ *」和代碼不能編譯:

#include <stdio.h> 
int main(void) 
{ 
    #ifdef abcd 
    printf("what ever it is"); 
    #endif */ --> the problem with this stray '*/' after #endif 
    return 0; 
} 
+0

這是很難明白你在這裏問... –

+0

請修改你的問題,我們不真正明白你的問題是什麼。 – Cristy

回答

0

如果我得到你有問題嗎?

這很好,因爲代碼不應該編譯。你的評論離開頭很近。

你可以做的是「// /」代替「/」:

/* 
#ifdef abcd 
printf("what ever it is"); 
#endif //*/ 

這是這樣,你可以從一開始就刪除「/ *」沒有問題。

0
#endif */ 

這是塊註釋的結尾,塊註釋打開的地方在哪裏?

/* 
+1

也許他想知道,爲什麼即使沒有評論開放...代碼編譯罰款... –

2

的猜測:這是嚴格的預處理器的一個bug,並且它的作用是忽視了一個#endif之後的一切,可不能跟任何東西反正。

+0

+1 Yeap。你是對的。關於這個bug的任何地方的文檔?我不知道存在這樣的錯誤。這種錯誤的含義是什麼?生成的.obj文件是否有'#endif'之後的任何內容? –

+0

原始問題在編輯前很難理解。我甚至沒有意識到問題是爲什麼它編譯! – Neil

3

我剛剛編譯你用gcc 4.6.X提供不帶任何標誌的代碼,並在第一次刪除所有的意見得到了警告

warning: extra tokens at end of #endif directive [enabled by default] 

所以預處理,然後就跳過所有的數據在線路#萬一。所以我不知道它是一個bug還是一個特性,但是我得到了關於它的警告,所以開發人員知道這個問題。

0

首先,由於*/不是註釋的組成部分,因此在C 2011(n1570)5.1.1.2 1 3 .;中描述的翻譯階段3中忽略。角色簡單地通過不變。

因此,在階段4(執行預處理器指令)中,編譯器會看到#endif */。的每個C 2011(n1570)6.10 1,一種用於#endif指令正確的語法是:

# endif new-line 

也就是說,它包括三個預處理標記,#endif,和一個新行字符,用空格和製表符允許在令牌之間。所以#endif */是不正確的語法。

5.1.1.3如果源違反語法規則,則需要一致性實現來生成診斷消息。因此,如果編譯器在這種情況下不會產生警告或錯誤消息,則不符合。

某些編譯器在默認情況下以不符合C標準的模式運行。你的編譯器可能有開關來改變它,例如GCC的-std=c99開關。如果您的編譯器在符合模式下不發出警告或錯誤消息,那麼這是一個錯誤。