2010-02-10 89 views
1

現在不用C++編寫代碼,但是當我在C#中遇到問題時出現了一個問題。希望這裏的專家能夠輕鬆地給出一個答案。C++,#ifdef問題

Class A{ 
    #ifdef AFlag 
    public void methodA(){...} 
    #endif 
} 

Class B{ 
... 
    A a; 
    a.methodA(); 
... 
} 

Class C { 
... 
    A a; 
    a.methodA(); 
... 
} 

如果AFlag沒有在任何地方定義,會發生什麼?編譯錯誤或沒有錯誤,但方法和那些調用該方法的語句不會被編譯? 謝謝

+0

這是使用'#if'描述特定特定代碼的複雜性的一個例子。類「B」和「C」需要使用相同的「#if」。因此它使用'A :: methodA()'傳播到任何代碼片段。這就是噩夢的開始和企業利潤的浪費。另一個喜歡功能替換(通過鏈接器)(或包括所有代碼和使用配置數據文件)的原因。 – 2010-02-10 19:51:33

回答

9

會出現編譯錯誤。

+0

+1更快的手指 – 2010-02-10 17:20:12

3

A類不會有methodA,所以編譯B類或C類將會失敗。

0

如果沒有定義AFlag,類A不會有一個成員函數methodA(),所以在B類中調用它,C會有誤差。

0

你會看到一個編譯錯誤,因爲在了methodA不上A級定義

1

你將有一個編譯器錯誤的方法,爲methodA不被任何聲明的功能。你可以使用這個語法來代替:

Class A{ 

    public void methodA() 
    { 
#ifdef AFlag 
    ... 
#endif 
    } 

} 

,這將使methodA中聲明/定義,但如果你把優化它的服務將被優化掉。

4

預處理髮生之前編譯。當代碼進入編譯器時,類A中方法A的定義將被刪除。實際上它好像你從未寫過。所以這會導致編譯錯誤。

+0

+1包括關鍵點:預處理器在源文件中有一個* BEFORE *編譯器甚至可以看到它。編譯器從來沒有機會看到任何預處理符號。 – 2010-02-10 17:46:34

1

很難說,因爲「...」中的代碼可能會影響答案,或者說我誤解了這個問題。聲明a.methodA();必須位於函數的主體中。

您會在行a.methodA();處收到編譯錯誤(或者如果代碼被分割到多個翻譯單元中,並且類A的定義不一致),則會發生編譯錯誤。調用函數意味着它必須在那裏。如果該函數不存在,則該調用不會被「忽略」。