2013-05-13 91 views
0

我想基於邊界C++ #elif指令被丟棄

template<class B> 
struct IntDecl { 

enum { 
    L = B::_l, U = B::_u 
}; 
#if (L >=0 && U <=255) 
    typedef char Type; 
#elif (L>=0&&U<=65535) 
    typedef unsigned int Type; 
#endif 

}; 

所以創建一個類型聲明,因爲你在這裏看到的取決於LU的類型將被定義的值。 例如

IntDecl< BOUND < 0, 65535 > >::Type i; // this should be a unsigned int 
IntDecl< BOUND < 0, 255 > >::Type i1; // this should be a char 

的問題是,無論是(ii1)被認爲chars,在#elif被丟棄換句話說。任何幫助?爲什麼#elif沒有執行?

+3

你誤會了。預處理器在編譯器之前運行,只是進行文本替換。 – chris 2013-05-13 23:45:29

+0

最好不要使用以下劃線開頭的名稱;它們基本上被保留用於'執行'。如果U大於65535(如果使用C預處理器的構造完全可以工作),則最終會出現問題。你應該有一個'#else'子句,以便覆蓋其他情況(並且它可能包含一個'#error'指令,以防止代碼編譯的信息比根本沒有定義'Type'的信息更好) 。 – 2013-05-14 00:10:14

+0

@JonathanLeffler是的,我同意,但基本不工作 – 2013-05-14 01:49:54

回答

2

預處理程序傳遞發生在語義分析之前,枚舉是一個語義結構。您需要使用模板來實現此操作,或者使用定義預處理器常量的宏和LU宏。