[英]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解釋未定義的令牌(宏),如cocos2d
和x
計算為0
因此您需要為您正在使用的宏定義值。
如果我理解正確, cocos2d-x
是幾種可能的API之一。
預處理器可以測試是否定義了符號(使用#ifdef
和defined
運算符),它可以計算常量整數表達式(使用#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)。 假設在頭文件中,我們要測試CONFIG
的special
值。 在任何給定的翻譯單元中, 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.