2011-10-04 78 views
1

我一直在尋找一些類我使用的代碼,和我遇到的代碼來是這樣的:在C IFDEF基於繼承問題++

#ifdef SOME_OBSCURE_CONDITION 
class A { 
#elif 
class A : public B { 
#endif 

還能有這樣的代碼有問題嗎?

具體來說,假設文件x.cpp包含y.h和z.h. z.h和y.h都包含a.h(它定義了類A),但是另外y.h定義了SOME_OBSCURE_CONDITION。在這種情況下,x的兩個衝突定義不會出現在x.cpp中嗎?

+0

這就是爲什麼我討厭宏的原因 – onof

+3

@onof:通過同樣的邏輯,你應該討厭電力。 –

+0

@ TomalakGeret'kal :)我更喜歡其他技術。宏是C的。http://www2.research.att.com/~bs/bs_faq2.html#macro – onof

回答

3

是,這兩個變化同時將違反ODR(一個定義規則),並可能導致任何東西,從

  • 編譯錯誤,包括
  • 鏈接錯誤
  • 未定義行爲(但不僅限於崩潰)

只要您可以確保SOME_OBSCURE_CONDITION定義是全局標識cal(也可以跨部分構建/重新鏈接...)不會有問題。

0

不可能在一般情況下回答。我相信你可以找到方法來打破這一點,但幾乎任何事情都是如此。

2

如果有人使用這樣的代碼構造,則用戶有責任正確處理宏。
你可以打破它嗎?
是的,C++允許你在腳下拍攝自己,這取決於你自己。

0

這是您的責任,以保證所有翻譯單位看到相同的類型和類定義。編譯器不需要產生診斷(事實上,如果你想保持模塊化編譯系統的好處,這甚至是不可能的)。

即使沒有任何預處理器的使用,您也可以通過爲不同的TU提供同一類的不同定義來生成不規範代碼的示例。使用頭文件只需要一定程度的處理。

+0

在這種情況下,編譯器甚至不能提供診斷,因爲預編譯器會評估宏,而糟糕的編譯器會嘗試編譯它所得到的結果。 –

0

這種情況的結果是編譯失敗或運行時未定義的行爲。如果您需要使用此類,請在項目設置中定義此常數,而不是在代碼中。如果你對這堂課感到畏懼......那麼最好不要考慮別的東西,不要使用條件編譯。