4

如果我这样做,在预编译的头文件中:

#define DS_BUILD
#define PGE_BUILD
#define DEMO

然后在源代码中我这样做:

#if (DS_BUILD && DEMO)
    ---- code---
#elif (PGE_BUILD && DEMO)
    --- code---
#else
    --- code ---
#endif

我是否收到一条错误消息:

错误:运算符“&&”没有正确的操作数

我以前从未见过这种情况。我在 OS X 10.6.3 上使用 XCode 3.2、GCC 4.2

4

4 回答 4

13

您需要添加定义的关键字,因为您想检查您定义的是否已定义。

#if defined (DS_BUILD) && defined (DEMO)
    ---- code---
#elif defined (PGE_BUILD) && defined (DEMO)
    --- code---
#else
    --- code ---
#endif
于 2010-04-07T22:56:54.053 回答
4

您必须首先决定如何使用条件编译宏。通常有两种流行的方法。它是

#define A
#define B

#ifdef A
...
#endif

#if defined(A) && defined(B)
...
#endif

或者

#define A 1
#define B 0

#if A
...
#endif

#if A && B
...
#endif

即,要么只定义一个宏并用#ifdef和/或分析它,要么#if defined()为一个数值定义一个宏,然后用 分析#if

您在代码示例中混合了这两种方法,这通常没有意义。决定你想使用哪种方法并坚持下去。

于 2010-04-07T22:55:34.977 回答
2

的效果#define DEMO是,在预处理期间,每次出现的DEMO都被替换为空 ( '')。与 相同#define PGE_BUILD。因此,在您发布的第二个示例中,您有效地得到#elif ( && )了,您同意,这对编译器没有多大意义:)。

于 2010-04-07T22:57:22.940 回答
1

您需要为DS_BUILDPGE_BUILD和提供值DEMO,或者您需要使用 ifdef

#define DS_BUILD 1
#define PGE_BUILD 1
#define DEMO 1

像上面这样定义会起作用

于 2010-04-07T22:59:22.087 回答