如何用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 违规可能很快就会发生。
所有定义应该相同。
所以我使用预处理器宏 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 违规可能很快就会发生。
所有定义应该相同。