【问题标题】:How to replace NDEBUG by C++ means如何用 C++ 替换 NDEBUG 手段
【发布时间】: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


【解决方案1】:

如果您使用变量或函数,如果您将定义了 NDEBUG 的文件与这些变量/函数混合使用,则可能会违反 ODR。

您可以声明一个具有匹配 NDEBUG 存在值的 MACRO。

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

在 noexept 子句和静态 if 中使用它

但仍然要注意,因为 ODR 违规可能很快发生。

所有定义都应该相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 2012-12-06
    • 2020-05-18
    • 1970-01-01
    • 2012-12-08
    相关资源
    最近更新 更多