簡體   English   中英

是否可以比較條件使用的#ifdef值

[英]Is it possible to compare #ifdef values for conditional use

我試圖想出一種通用的,易於使用的方式來運行某些代碼,這取決於我當時使用的api。

在標題中:

#define __API_USED cocos2d-x

#define COCOS2DX  cocos2d-x
#define OPENGL opengl

#ifdef __API_USED == COCOS2DX
    #define USING_COCOS2DX
    #undef USING_OPENGL
#endif

來源:

#ifdef USING_COCOS2DX
    ......
#endif

但是,我不認為這會奏效。

有沒有辦法完成我想做的事情?

你可以,但你需要這樣做:

#define __API_USED COCOS2DX

#define COCOS2DX  1
#define OPENGL 2

#if __API_USED == COCOS2DX
    #define USING_COCOS2DX
    #undef USING_OPENGL
#endif

正如Keith Thompson解釋未定義的令牌(宏),如cocos2dx計算為0因此您需要為您正在使用的宏定義值。

如果我理解正確, cocos2d-x是幾種可能的API之一。

預處理器可以測試是否定義了符號(使用#ifdefdefined運算符),它可以計算常量整數表達式(使用#if )。

一種方法是為每個API定義數字代碼:

#define COCOS2X         1
#define ANOTHER_API     2
#define YET_ANOTHER_API 3
/* ... */

然后:

#define API_USED COCOS2DX
#if API_USED == COCOS2DX
    #define USING_COCOS2DX
    #undef USING_OPENGL
#elif API_USED == ANOTHER_API
    /* ... */
#elif API_USED == YET_ANOTHER_API
    /* ... */
#endif

請注意,我已將您的宏名稱__API_USED更改為API_USED 以兩個下划線(或下划線后跟大寫字母)開頭的標識符保留給實現用於所有目的; 你不應該在自己的代碼中定義它們。

這種方法的一個缺點是不會標記拼寫錯誤; 預處理器用常量0靜靜地替換任何未定義的標識符。

為每個API設置一個標識符可能更好,並且當且僅當使用該API時才定義它:

#define USING_COCOS2X
/* #undef USING_COCOS2X */

然后:

#if USING_API_COCOS2X
    #undef USING_OPENGL
#endif

測試宏是否定義往往比測試宏是否具有特定值更有效。

然后,您必須確保USING_API_*宏(如果有多個)一致地定義。

這對我來說適用於clang 8.1.0(來自Xcode 8.3.2)。 假設在頭文件中,我們要測試CONFIGspecial值。 在任何給定的翻譯單元中, CONFIG可能未設置,或者可能設置為special ,或者可能設置為其他。

#define CAT_HELPER(lhs, rhs) lhs##rhs
#define CAT(lhs, rhs) CAT_HELPER(lhs, rhs)

#define TEST_PREFIX_special 1

#if CAT(TEST_PREFIX_, CONFIG)
#pragma message("detected CONFIG == 'special'")
#else
#pragma message("CONFIG != 'special'")
#endif

雙重間接( CAT()調用CAT_HELPER() )很重要。

這種策略依賴於#if將未定義的宏擴展為0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM