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

标签 c++ c-preprocessor

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

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

相关文章:

你能用 C#define 注释吗?

c++ - 编译头文件定义了一个模板类,其中还包括其他头文件

C++高分辨率SYSTEMTIME结构,大于ms?

c++ - 使定义/包含生成的结构适应 boost::fusion

c++ - 如何使用 C 预处理器用环境变量进行替换

C99, "Despite the name, a non-directive is a preprocessing directive."

c++ - 从 Writing Solid Code 调试内存包装代码,或可下载的 C/C++ 的类似替代品?

c++ - 如何使用 remove-erase idiom 删除 vector 中的空 vector ?

C++:对 `Json::Value::Value(Json::ValueType)' 的 undefined reference

c# - C# 预处理器指令中运算符的优先级是什么?