gpt4 book ai didi

c++ - 如何获得指示宏是否已定义的 bool 值?

转载 作者:行者123 更新时间:2023-12-01 13:42:55 28 4
gpt4 key购买 nike

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

#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;

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

如果定义了宏,是否有一种很好的方法可以使用 bool 值或 1 或 0?

最佳答案

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

这是工作代码:

#include <iostream>

// Define two genetic macros
#define SECOND_ARG(A,B,...) B
#define CONCAT2(A,B) A ## B

// If a macro is detected, add an arg, so the second one will be 1.
#define DETECT_EXIST_TRUE ~,1

// DETECT_EXIST merely concats a converted macro to the end of DETECT_EXIST_TRUE.
// If empty, DETECT_EXIST_TRUE converts fine. If not 0 remains second argument.
#define DETECT_EXIST(X) DETECT_EXIST_IMPL(CONCAT2(DETECT_EXIST_TRUE,X), 0, ~)
#define DETECT_EXIST_IMPL(...) SECOND_ARG(__VA_ARGS__)

// We will create MY_DEFINE, but not MY_DEFINE2
#define MY_DEFINE

int main()
{
// We can now use DETECT_EXIST to detect defines.
std::cout << "MY_DEFINE = " << DETECT_EXIST(MY_DEFINE) << std::endl;
std::cout << "MY_DEFINE2 = " << DETECT_EXIST(MY_DEFINE2) << std::endl;
}

此代码将产生输出:
MY_DEFINE = 1
MY_DEFINE2 = 0

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

如果宏设置为诸如 1 之类的值,您只需要使用 DETECT_EXIST_TRUE 的替代版本来处理它,并将宏值粘贴在末尾。例如:
#define DETECT_EXIST_TRUE1 ~,1

那么如果你有:
#define MY_DEFINE1 1

像这样的代码也可以在 main 中正常工作:
std::cout << "MY_DEFINE1 = " << DETECT_EXIST(MY_DEFINE1) << std::endl;

关于c++ - 如何获得指示宏是否已定义的 bool 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41265750/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com