C++ 是否可以比较有条件使用的#ifdef值
我正试图找到一种通用的、易于使用的方法,根据我当时使用的api,只运行某些代码 在标题中:C++ 是否可以比较有条件使用的#ifdef值,c++,conditional,c-preprocessor,preprocessor-directive,C++,Conditional,C Preprocessor,Preprocessor Directive,我正试图找到一种通用的、易于使用的方法,根据我当时使用的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 ..
#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解释的那样,未定义的标记(宏),如
CoCoCos2D
和x
计算为0
,因此您需要为正在使用的宏定义值。如果我理解正确,CoCoCos2D-x
是几种可能的API之一
预处理器可以测试是否定义了符号(使用#ifdef
和定义的运算符),并且可以计算常量整数表达式(使用#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
#if USING_API_COCOS2X
#undef USING_OPENGL
#endif
请注意,我已将您的宏名称\uuuu API\u USED
更改为API\u USED
。以两个下划线开头的标识符(或以一个下划线后跟一个大写字母)保留给实现用于所有目的;您不应该在自己的代码中定义它们
这种方法的一个缺点是不会标记拼写错误;预处理器用常量0
悄悄地替换任何未定义的标识符
最好为每个API设置一个标识符,并在且仅在使用该API时定义它:
#define USING_COCOS2X
/* #undef USING_COCOS2X */
然后:
#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
#if USING_API_COCOS2X
#undef USING_OPENGL
#endif
测试宏是否定义比测试它是否具有特定值更可靠
然后,您只需确保使用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\u HELPER()
)很重要
这种策略依赖于#if
将未定义的宏扩展为0
使用#if
而不是#ifdef
#define\u API\u使用cocos2d-x
-man,因为连字符很奇怪。@WiSaGaN:但这只有在#API\u使用了和cocococos2dx
扩展到整数表达式时才有效。预处理器无法识别cocos2d-x
;除非cocos2d
和x
是宏,否则它会将其视为0-0
。与其定义\uuuu-API\u-USED
然后检查其值以定义另一个宏,为什么不直接使用COCOS2DX
或使用OPENGL
定义?谢谢!这正是我要找的。