Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以比较有条件使用的#ifdef值_C++_Conditional_C Preprocessor_Preprocessor Directive - Fatal编程技术网

C++ 是否可以比较有条件使用的#ifdef值

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 ..

我正试图找到一种通用的、易于使用的方法,根据我当时使用的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解释的那样,未定义的标记(宏),如
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
定义
?谢谢!这正是我要找的。