1

我之前使用过一个代码库,它有一个用于启用和禁用代码段的宏系统。它看起来像下面这样:

#define IN_USE      X
#define NOT_IN_USE  _

#if defined( WIN32 )
    #define FEATURE_A       IN_USE
    #define FEATURE_B       IN_USE
    #define FEATURE_C       NOT_IN_USE
#elif defined( OSX )
    #define FEATURE_A       NOT_IN_USE
    #define FEATURE_B       NOT_IN_USE
    #define FEATURE_C       IN_USE
#else
    #define FEATURE_A       NOT_IN_USE
    #define FEATURE_B       NOT_IN_USE
    #define FEATURE_C       NOT_IN_USE
#endif

然后功能的代码将如下所示:

void DoFeatures()
{
#if USING( FEATURE_A )
    // Feature A code...
#endif

#if USING( FEATURE_B )
    // Feature B code...
#endif

#if USING( FEATURE_C )
    // Feature C code...
#endif

#if USING( FEATURE_D ) // Compile error since FEATURE_D was never defined
    // Feature D code...
#endif
}

我的问题(我不记得的部分)是如何定义“USING”宏,以便在该功能未定义为“IN_USE”或“NOT_IN_USE”时出错?如果您忘记包含正确的头文件,可能会出现这种情况。

#define USING( feature ) ((feature == IN_USE) ? 1 : ((feature == NOT_IN_USE) ? 0 : COMPILE_ERROR?))
4

6 回答 6

5

您的示例已经实现了您想要的,因为如果未定义#if USING(x)将产生错误消息。USING您在头文件中需要的只是类似

#define IN_USE 1
#define NOT_IN_USE 0
#define USING(feature) feature

如果你想确保你也得到一个错误只是为了做类似的事情

#if FEATURE

或者

#if USING(UNDEFINED_MISPELED_FEETURE)

然后你可以做,说,

#define IN_USE == 1
#define NOT_IN_USE == 0
#define USING(feature) 1 feature

但你将无法防止这样的误用

#ifdef FEATURE
于 2013-08-21T04:39:53.790 回答
1

以下作品。它会给你 FEATURE_D 的编译错误。如果您注释掉 FEATURE_D 的代码,那么它将执行 FEATURE_A 和 FEATURE_B 的代码。代码几乎是不言自明的。无需检查 FEATURE_D 或其他是否在 DoFeatures 函数中定义,您只需将它们放在 if 块中即可。这样,编译器将尝试执行代码块。如果为 1,则执行 if 块中的代码;如果为 0,则不会执行。如果它从未被定义,那么将得到一个编译错误。

#include <stdio.h>

#define IN_USE      1
#define NOT_IN_USE  0

#define FEATURE_A       IN_USE
#define FEATURE_B       IN_USE
#define FEATURE_C       NOT_IN_USE


void DoFeatures()
{
    if(FEATURE_A){
        // Feature A code...
        printf("Feature A\n");
    }

    if(FEATURE_B){
        // Feature B code...
        printf("Feature B\n");
    }

    if(FEATURE_C){
        // Feature C code...
        printf("Feature C\n");
    }

    if(FEATURE_D) {// Compile error since FEATURE_D was never defined
        // Feature D code...
        printf("Feature D\n");
    }
}

int main(int argc, char **argv)
{
    DoFeatures();
    return 0;
}
于 2013-08-21T05:05:44.033 回答
0
#define IN_USE      1
//#define NOT_IN_USE  _  //Not required


#if defined( WIN32 )
    #define FEATURE_A       IN_USE
    #define FEATURE_B       IN_USE
    #define FEATURE_C       NOT_IN_USE
#elif defined( OSX )
    #define FEATURE_A       NOT_IN_USE
    #define FEATURE_B       NOT_IN_USE
    #define FEATURE_C       IN_USE
#else
    #define FEATURE_A       NOT_IN_USE
    #define FEATURE_B       NOT_IN_USE
    #define FEATURE_C       NOT_IN_USE
#endif

#define USING( feature ) feature

然后你的代码

于 2013-08-21T04:19:43.800 回答
0

如果不使用就不要定义它

#if defined( WIN32 )
    #define FEATURE_A       
    #define FEATURE_B       
#else if defined( OSX )
    #define FEATURE_C      
#else

#endif

然后在你的代码中:

void DoFeatures()
{
#ifdef FEATURE_A
    // Feature A code...
#endif

#ifdef FEATURE_B
    // Feature B code...
#endif

#ifdef FEATURE_C
    // Feature C code...
#endif

#ifdef FEATURE_D // Compile error since FEATURE_D was never defined
    // Feature D code...
#endif
}
于 2013-08-21T04:13:38.597 回答
0

你不能用另一组#ifdefs吗?

#if defined(WIN32)
    #define FEATURE_A
    #define FEATURE_B
#elif defined (OSX)
    #define FEATURE_C
#endif

// ...

#if defined(FEATURE_A)
    do_a();
#endif

等等

于 2013-08-21T04:15:38.270 回答
0

这样的事情怎么样?

#define IN_USE      1
#define NOT_IN_USE  0

#if defined( WIN32 )
    #define FEATURE_A       IN_USE
    #define FEATURE_B       IN_USE
    #define FEATURE_C       NOT_IN_USE
#elif defined( OSX )
    #define FEATURE_A       NOT_IN_USE
    #define FEATURE_B       NOT_IN_USE
    #define FEATURE_C       IN_USE
#else
    #define FEATURE_A       NOT_IN_USE
    #define FEATURE_B       NOT_IN_USE
    #define FEATURE_C       NOT_IN_USE
#endif

#define USING(f) ((f == IN_USE) ? 1 : (f == NOT_IN_USE) ? 0 : (f))

#include <stdio.h>

void DoFeatures()
{
#if USING( FEATURE_A )
    // Feature A code...
    printf("Feature A\n");
#endif

#if USING( FEATURE_B )
    // Feature B code...
    printf("Feature B\n");
#endif

#if USING( FEATURE_C )
    // Feature C code...
    printf("Feature C\n");
#endif

#if defined( FEATURE_D ) // Compile error since FEATURE_D was never defined
    // Feature D code...
    printf("Feature D\n");
#else
#error FEATURE_D not defined.
#endif
}

int main(int argc, char **argv)
{
    DoFeatures();
    return 0;
}

对于编译错误,我不知道如何将其集成到宏中。如果有人能给我们一些启示,我们将不胜感激。:P

于 2013-08-21T04:36:51.663 回答