C/C++預處理表達式中可接受的內容

因爲C++裏推薦用枚舉來代替宏定義,因而在C++代碼中都很少使用宏定義。

但是現在碰到一個需求,就是希望在編譯的時候知道兩個常數是否一致(比如兩個版本號),第一反應就是用#if,但是結果發現#if根本不能接受enum, 甚至不能接受const:


//============CLASS ENUM==========

class A {

    enum {
        CLASS_ENUM_A = 1
    };

};


class B {

    enum {
        CLASS_ENUM_B = 2
    };

};


#if A::ENUM_A != B::ENUM_B	//error: token "::" is not valid in preprocessor expressions|
    #error "class enum A != B"
#endif // A




//===================NORMAL ENUM========================


enum {
    ENUM_A = 1,
    ENUM_B = 2
};


#if ENUM_A != ENUM_B		// 直接忽略
    #error "enum A != B"
#endif // A




//====================CONST===============================
const int constA = 1;
const int constB = 10;




#if constA != constB		// 直接忽略
    #error "const A != B"
#endif // constA



//=======================DEFINE==============================
#define defineA 1
#define defineB 2


#if defineA != define		// OK
    #error "define A != B"
#endif // defineA



因爲預處理基本上就是宏定義展開,對程序內容和結構並沒有處理,所以並不知道某個常數值爲多少,某個枚舉值爲多少,更不知道存在某個類,因而只能接受宏定義。

話說有沒有某種方法可以在編譯後判斷程序裏某個常數值的範圍?


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章