混合 NDEBUG - 安全吗?
Mixing NDEBUG - is it safe?
- 考虑一个C++头文件,该文件以
my_lib.a
和my_prog
编译,与my_lib.a
链接。该库是在没有NDEBUG
的情况下编译的,而my_prog
- 带有NDEBUG
。它会导致违反 ODR 吗? - 如果
my_lib.so
是共享库怎么办?当然,ODR 在这里无关紧要,因为有 2 个单独的可执行文件,但NDEBUG
会影响std
(或其他)类,从而阻止通过 SO 接口正确传递它们的实例吗?例如,如果在my_prog
中创建了一个std::vector
实例,是否可以将其作为参数传递给SO?NDEBUG
可能会影响内存分配等吗?
《标准》对此有明确规定吗?
20.5.2.2 标头 [using.headers]
- 翻译单元可以包含任何顺序的库标题(第 5 条)。每个都可以包含多次,与只包含一次没有效果不同,只是包含
<cassert>
或<assert.h>
的效果每次都取决于NDEBUG
的词汇当前定义。
对于标准标头,这保证不会成为问题,但是您突出显示的问题确实适用于您自己提供的源文件中的函数。
6.2 单定义规则 [basic.def.odr]
一个
- 类 [function/enum/variable/etc] 可以有多个定义,前提是这些定义满足以下要求:
[...]
D
的每个定义应由相同的令牌序列组成;
请注意,标记化发生在预处理之后,因此如果定义包含任何assert
,则必须预处理为相同的标记序列,即在编译过程中必须具有相同的NEDBUG
设置。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 通过网络、跨平台传递std::变体是否安全
- 在std::thread中,joinable()然后join()线程安全吗
- 使用std::istream::peek()总是安全的吗
- 从值小于256的uint16到uint8的Endian安全转换
- 在c++队列中使用pop和visit实现线程安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 安全到标准:移动会员?
- AcquireCredentialsHandleA() 返回 PFX 文件的0x8009030e(安全包中没有可用的凭据
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 混合 NDEBUG - 安全吗?