我正在处理一些基于几何的代码。手头的任务涉及使用边界框来包含固体标本。现在,在代码中,我设计了两种不同类型的此类框,即INNER_BOUNDING_BOX
和OUTER_BOUNDING_BOX
。该代码还期望使用两个框中的任何一个,但不是两个。我试图通过使用预处理器来实现它。
我已经基于几个宏USE_INNER_BOUNDING_BOX
和USE_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_BOX
或USE_OUTER_BOUNDING_BOX
中的任何一个的定义,当两者都不存在时明确定义。
我倾向于使用可移植代码,但特定于编译器的技巧也可以通过。我使用Visual Studio 2012
。
答案 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
这只适用于这种情况。如果有更多的盒子,我会附加条件块。