如何用C++方式替换NDEBUG

How to replace NDEBUG by C++ means

所以我使用预处理器宏 NDEBUG 为我的调试版本启用一些检查。但我想用 C++ 常量替换它,以便在 noexept 子句和 static if 中使用它。我知道我可能可以像这样实现它:

// in constants.hpp

#ifdef NDEBUG
constexpr bool ndebug = true;
#else
constexpr bool ndebug = false;
#endif

但使用 NDEBUG,您可以向编译器提供 -D NDEBUG 标志,但对于某些文件,您可以手动指定 #undef NDEBUG。因此,部分代码将使用 NDEBUG 进行编译,而部分代码将在没有它的情况下进行编译。因此,即使在一个翻译单元中,也会有定义了 NDEBUG 的部分和没有定义的部分。

C++ 是否有可能设计出 100% 符合此行为的东西,因此在每个头文件中都会有编译时 bool 常量,其值基于 NDEBUG

您当然可以在每个文件中创建具有不同名称的常量,如果这是唯一的方法,您至少可以以某种方式自动执行此操作吗?

如果您使用变量或函数,如果您将定义了 NDEBUG 或未定义的文件与 variable/function.

混合使用,则可能会违反 ODR

您可以声明一个 MACRO,其值与存在的 NDEBUG 相匹配。

#ifdef NDEBUG
# define NDEBUG_VALUE true
#else
# define NDEBUG_VALUE false
#endif

to use it in noexept clause and in static if

但还是要小心,因为 ODR 违规可能很快就会发生。

所有定义应该相同。