混合 NDEBUG - 安全吗?

Mixing NDEBUG - is it safe?

本文关键字:安全 NDEBUG 混合      更新时间:2023-10-16
  1. 考虑一个C++头文件,该文件以my_lib.amy_prog编译,与my_lib.a链接。该库是在没有NDEBUG的情况下编译的,而my_prog- 带有NDEBUG。它会导致违反 ODR 吗?
  2. 如果my_lib.so是共享库怎么办?当然,ODR 在这里无关紧要,因为有 2 个单独的可执行文件,但NDEBUG会影响std(或其他)类,从而阻止通过 SO 接口正确传递它们的实例吗?例如,如果在my_prog中创建了一个std::vector实例,是否可以将其作为参数传递给SO?NDEBUG可能会影响内存分配等吗?

《标准》对此有明确规定吗?

20.5.2.2 标头 [using.headers]

  1. 翻译单元可以包含任何顺序的库标题(第 5 条)。每个都可以包含多次,与只包含一次没有效果不同,只是包含<cassert><assert.h>的效果每次都取决于NDEBUG的词汇当前定义。

对于标准标头,这保证不会成为问题,但是您突出显示的问题确实适用于您自己提供的源文件中的函数。

6.2 单定义规则 [basic.def.odr]

    一个
  1. 类 [function/enum/variable/etc] 可以有多个定义,前提是这些定义满足以下要求:

[...]D的每个定义应由相同的令牌序列组成;

请注意,标记化发生在预处理之后,因此如果定义包含任何assert,则必须预处理为相同的标记序列,即在编译过程中必须具有相同的NEDBUG设置。