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

标准是否规定了这一点?

4

1 回答 1

1

20.5.2.2 标头 [using.headers]

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

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

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

  1. 如果定义满足以下要求,则可以有多个类 [function/enum/variable/etc] 的定义:

[...] 的每个定义D都应由相同的标记序列组成;

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

于 2019-08-13T06:31:17.110 回答