[英]Mixing NDEBUG - is it safe?
my_lib.a
和my_prog
与链接my_lib.a
。 该库是在没有NDEBUG
情况下编译的,而my_prog
-with NDEBUG
。 它会导致 ODR 违规吗?my_lib.so
是共享库怎么办? 当然,ODR 在这里无关紧要,因为有 2 个单独的可执行文件,但是NDEBUG
会以一种会阻止通过 SO 接口正确传递它们的实例的方式影响std
(或其他)类? 例如,如果在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
设置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.