用于模拟默认定义的条件宏定义

时间:2017-11-24 08:57:16

标签: c visual-studio-2012 c-preprocessor

我正在处理一些基于几何的代码。手头的任务涉及使用边界框来包含固体标本。现在,在代码中,我设计了两种不同类型的此类框,即INNER_BOUNDING_BOXOUTER_BOUNDING_BOX。该代码还期望使用两个框中的任何一个,但不是两个。我试图通过使用预处理器来实现它。 我已经基于几个宏USE_INNER_BOUNDING_BOXUSE_OUTER_BOUNDING_BOX编写了更多代码。我可以确保在任何时候通过一些简单的结构定义任何一个宏:

#if defined(USE_INNER_BOUNDING_BOX) && defined(USE_OUTER_BOUNDING_BOX)
    #undef USE_INNER_BOUNDING_BOX
    #undef USE_OUTER_BOUNDING_BOX
    #define USE_INNER_BOUNDING_BOX
#endif

#ifndef USE_INNER_BOUNDING_BOX
    #ifndef USE_OUTER_BOUNDING_BOX
        #define USE_INNER_BOUNDING_BOX
    #endif
#endif

现在,如果我想使用任何特定的盒子,我可以定义相应的宏。困难在于需要使用默认设置宏USE_DEFAULT_BOUNDING_BOX,我可以使用该宏来设置USE_INNER_BOUNDING_BOXUSE_OUTER_BOUNDING_BOX中的任何一个的定义,当两者都不存在时明确定义。 我倾向于使用可移植代码,但特定于编译器的技巧也可以通过。我使用Visual Studio 2012

3 个答案:

答案 0 :(得分:1)

通过立即选择一个多值开关,可以更好地完成可靠的多种选择。

#define BOUNDING_INNER 1
#define BOUNDING_OUTER 2

/* default */
#define BOUNDING_BOX_TO_USE BOUNDING_INNER

/* alternatively please activate below line 
#define BOUNDING_BOX_TO_USE BOUNDING_OUTER
*/

如果您需要向后兼容某些配置,请执行以下操作: 例如您的代码已被其他人使用,
您可以从两者中派生单个开关,与您的默认行为相匹配。 优点是避免#undef(如果您同意这样做是有利的。)

#if defined(USE_INNER_BOUNDING_BOX) && defined(USE_OUTER_BOUNDING_BOX)
#define BOUNDING_BOX_TO_USE BOUNDING_INNER
#endif

#ifndef USE_INNER_BOUNDING_BOX
    #ifndef USE_OUTER_BOUNDING_BOX
        #define BOUNDING_BOX_TO_USE BOUNDING_INNER
    #endif
#endif

/* In case you are as paranoid a programmer as I am,
   you might want to do some plausibility checking
   here. ifndef, >0, <2 etc., triggering some #errors. */


/* Later, in code doing the actual implementation: */

#if (BOUNDING_BOX_TO_USE == BOUNDING_INNER)
/* do inner bounding stuff */
#endif
/* other code, e.g. common for inner and outer */
#if (BOUNDING_BOX_TO_USE == BOUNDING_OUTER)
/* do outer bounding stuff */
#endif

答案 1 :(得分:0)

由于只有两个值,我只使用一个布尔变量:

#ifndef USE_OUTER_BOUNDING_BOX
    #define USE_OUTER_BOUNDING_BOX 0
#endif

如果USE_OUTER_BOUNDING_BOX为零(false),则使用内部边界框。

test.c的:

#include <stdio.h>

#ifndef USE_OUTER_BOUNDING_BOX
    #define USE_OUTER_BOUNDING_BOX 0
#endif

int main(void)
{
    printf("%d\n", USE_OUTER_BOUNDING_BOX);
    return 0;
}

示例:

$ cc -o test -DUSE_OUTER_BOUNDING_BOX=0 test.c
$ ./test 
0
$ cc -o test -DUSE_OUTER_BOUNDING_BOX=1 test.c
$ ./test
1

答案 2 :(得分:0)

以下是我的结论:

// Comment to use bigger outer Bounding-Box
#define USE_INNER_BOUNDING_BOX

#define INNER_BOUNDING_BOX 0
#define OUTER_BOUNDING_BOX 1

#define DEFAULT_BOUNDING_BOX OUTER_BOUNDING_BOX

#if defined(USE_INNER_BOUNDING_BOX) && !defined(USE_OUTER_BOUNDING_BOX)
    #define USE_BOUNDING_BOX INNER_BOUNDING_BOX
#elif defined(USE_OUTER_BOUNDING_BOX)
    #define USE_BOUNDING_BOX OUTER_BOUNDING_BOX
#else
    #define USE_BOUNDING_BOX DEFAULT_BOUNDING_BOX
#endif

#if (USE_BOUNDING_BOX == INNER_BOUNDING_BOX)
    #undef USE_OUTER_BOUNDING_BOX
    #define USE_INNER_BOUNDING_BOX
#else
    #undef USE_INNER_BOUNDING_BOX
    #define USE_OUTER_BOUNDING_BOX
#endif

这只适用于这种情况。如果有更多的盒子,我会附加条件块。