【发布时间】:2022-01-02 14:50:21
【问题描述】:
所以我使用预处理器宏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?
您当然可以在每个文件中创建具有不同名称的常量,如果这是您至少可以以某种方式自动执行此操作的唯一方法吗?
【问题讨论】:
-
没有标准的 C++ 方法来强制宏或变量以一种或另一种方式。但是有些编译器扩展可以强制将头文件包含到当前翻译单元的开头。例如 GCC
-include命令行选项。 -
but for certain files you can manually specify #undef NDEBUG所以不要这样做。我认为我从未在任何健全的代码中看到过#undef NDEBUG。
标签: c++ preprocessor