c语言 - 用于模拟默认定义的条件宏定义



我正在研究一些基于几何的代码。手头的任务涉及使用边界框来容纳固体试样。现在,在代码中,我设计了两种不同类型的此类框,即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中的任何一个设置 defined。 我倾向于可移植代码,但编译器特定的技巧也可以通过。我正在使用Visual Studio 2012.

像这样的可靠选择之一可以通过立即使用单个多值开关选择它们来更好地完成。

#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

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

#ifndef USE_OUTER_BOUNDING_BOX
#define USE_OUTER_BOUNDING_BOX 0
#endif

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

测试.c:

#include <stdio.h>
#ifndef USE_OUTER_BOUNDING_BOX
#define USE_OUTER_BOUNDING_BOX 0
#endif
int main(void)
{
printf("%dn", 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

这是我的结尾:

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

这在这种情况下有效。如果有更多的框,我会附加条件块。

最新更新