如何获取一个布尔值来指示是否定义了宏?

时间:2016-12-21 15:00:02

标签: c++ c-preprocessor

我的代码可以使用define宏进行配置。为了获得代码中的值,我这样做:

#ifdef CONFIG_X
static constexpr bool x = true;
#else
static constexpr bool x = false;
#endif

但是在具有多个配置变量的代码中,这很快变得非常难看......

我发现的另一个解决方案就是将代码分成两部分:

#ifdef CONFIG_X
#define CONFIG_X_BOOL true
#else
#define CONFIG_X_BOOL false
#endif

static constexpr bool x = CONFIG_X_BOOL;

这有点好,但也不是很好。

如果定义了一个宏,是否有一个很好的方法来获得布尔值或1或0?

2 个答案:

答案 0 :(得分:1)

这是可能的,但仅限于您正在寻找空定义的有限情况(通常是编译标志的情况)或您知道定义标志的方式的范围,例如0或1。

这是工作代码:

MY_DEFINE = 1
MY_DEFINE2 = 0

此代码将生成输出:

#define DETECT_EXIST_TRUE1 ~,1

因为第一个确实存在而第二个不存在。

如果将宏设置为1等值,则只需要使用备用版本的DETECT_EXIST_TRUE来处理它,并在末尾粘贴宏值。例如:

#define MY_DEFINE1 1

然后,如果你有:

std::cout << "MY_DEFINE1 = " << DETECT_EXIST(MY_DEFINE1) << std::endl;

这样的代码也可以在main中正常工作:

{{1}}

答案 1 :(得分:1)

  #ifndef CONFIG_X
  #error "Written for config x"
  #endif


    // True for config x, hack this about for other configurations
   static bool x = 1;

现在,如果配置不是x,它会中断。一般来说,这比试图猜测非X的未命名配置需要更好。