假设我们有一个静态链接到 MyLib1.0 的程序。 还有一个与 MyLib1.1 链接的共享库。 现在如果程序加载这个共享库会发生什么? 我的假设是在运行时我们将对相同的符号有多个不同的定义。 以下两种情况是否都违反了 ODR? 共享库导出所有符号,包括MyLib1.1的符号共享库隐藏了MyLib ...
假设我们有一个静态链接到 MyLib1.0 的程序。 还有一个与 MyLib1.1 链接的共享库。 现在如果程序加载这个共享库会发生什么? 我的假设是在运行时我们将对相同的符号有多个不同的定义。 以下两种情况是否都违反了 ODR? 共享库导出所有符号,包括MyLib1.1的符号共享库隐藏了MyLib ...
我想为 pod 结构X创建一个std::set<X> 。 我尝试提供免费的operator< 。 我不希望此运算符具有全局效果(在此编译单元之外),因此我将operator<设置为static 。 (链接到代码) 这编译得很好。 但是,如果我将operator<移动 ...
在以下代码中(这是基于更复杂代码的最小示例),基本 class 定义了 class 的本地结构。 派生的 class 会覆盖此定义,但也使用基础 class 中的定义。 使用 gcc 和-Wall -Wextra编译不会发出任何警告。 代码的 output 符合预期 但是,当使用 cppcheck ...
我最近知道以下代码格式不正确,NDR:// foo.h template <typename T> void foo(); // foo_bar.cpp template <> void foo<bar>() { /* Implementation for b ...
当使用基于范围的 for 循环迭代数组时,不绑定对每个元素的引用,这是否构成数组的 ODR 使用? 例子: foo::xs的定义是否必要? 虽然这段代码及其变体看起来运行良好,但这并不意味着定义从来没有必要。 缺少对 ODR 使用的变量的定义很少会产生诊断,因为该变量可以在另一个翻译单元中 ...
考虑以下示例:extern void not_defined(); void f() { not_defined(); } int main() {} 如果我要编译和链接上面的程序,我会得到一个 linker 错误undefined reference to not_defined( ...
比方说: 一些 header h.hpp在其模板参数上使用sizeof定义了一个模板 function f() 。 两个不同的 C++ 源文件a.cpp和b.cpp定义了它们自己的同名结构S 。 a.cpp和b.cpp都使用f()和它们自己的S 。 换句话说: h.hpp : a.cpp : ...
可以检测类型是否完整https://devblogs.microsoft.com/oldnewthing/20190710-00/?p=102678 如果一个类型是完整的,我有理由想要提供一个不同的(可内联的)实现。 模板化的 function 在基于 function 中的if constexp ...
在默认成员初始值设定项中使用是否仍然是 odr-use,即使默认成员初始值设定项未被任何构造函数使用? 例如,这个程序是否格式错误,因为g<A>是 odr-used 并且因此它的定义被隐式实例化? MSVC 认为不。 Clang、GCC 和 ICC 认为是的。 https://g ...
免责声明:这个问题是关于防止意外的命名冲突,并确保以下代码无法编译/链接。 [编辑] 实际上,我很高兴有一些东西可以阻止它编译/链接,或者一些可以解决这个问题的东西,比如匿名名称空间。 但是匿名命名空间不应该在标头内 go 。 这里发生的是 ctor S::S 有两个内联定义,因此允许 link ...
我想知道是否允许使用 const 成员的不同值多次声明相同的 class ,或者这是否会违反 ODR? 考虑这个带有两个独立翻译单元的示例,它们将链接到某个libx库中: 此外,如果这不合法,是否将x声明为const是否会有所不同? ...
我刚刚意识到这个片段可以安全地编译,而g++和clang上没有任何警告。 (给定--std=c++14 --Wall )#include <iostream> template <typename T> void foo(const T& a, const T& ...
我正在尝试使用interface类,并且我有以下class结构: IBase.h: IQuackable.h: 野鸭鸭.h: 野鸭鸭.cpp: 我还创建了 class RedHeadDuck.h 和.cpp,其声明和定义与 MallardDuck 相同。 最后,主要的 class 代码: 在这 ...
因此,例如,我的一个项目中有一个稍微复杂的库依赖案例: Rust 默认会优先使用 static 链接。 可执行文件 A 也被构建为静态链接 lib(std)c++。 因此,据我了解,A 和 B 中都会有两个 STL 实现副本。这正是https://developer.ZC31B32364CE19 ...
如果我将析构函数(或任何自动生成的构造函数)定义为默认值,如下所示: 然后将其包含在几个翻译单元中,这会破坏 ODR 吗? 有人可以引导我完成ODR页面上的步骤吗? 因为我很难理解编译器生成的析构函数是否会内联或其他一些效果以防止它破坏 ODR。 ...
我有一个 class 我想在 C 和 C++ 之间共享,其中 Z0D61F8370CAD14D61F8370CAD14D412F80B84 只能作为指针获取。 然而,因为它是一个内部 class 它不能被前向声明。 相反,这是我们当前代码在一个常见的 header 文件中所做的: 这看起来违反了单 ...
我一直在试图弄清楚inline说明符如何保留 ODR。 到目前为止,我写的所有内容似乎都没有必要,因为包含保护确保定义只包含一次。 假设我在名为constants.h的文件中有以下定义 根据我对与 ODR 相关的inline理解,编写inline说明符是为了确保这些常量的定义仅在多个翻译单元中 ...
我正在使用代码在我的服务器应用程序中包含rapidjson标头。 我编译的时候,没问题。 但是当应用程序中的其他一些库部分正在运行时,结果是 gdb 核心文件已经死了。 #0 0x00007f36c614e922 in rapidjson::MemoryPoolAllocator<rapid ...
我正在集成一个需要定义_UNICODE和UNICODE的库; 我现在不能在我的项目中全局设置这些定义,所以我想知道我是否可以安全地只用这些定义构建库代码。 我担心 ODR 违规,但据我了解,这些定义仅影响 Windows 和 C 运行时标头中的宏定义,因此我预计不会出现 ODR 违规(只要我自己在 ...
以下代码在 Visual Studio 2019 上生成错误 LNK2005 和 LNK1169。 我通过学习 Udemy 的课程达到了这一点,讲师似乎对此没有任何问题。 类似的问题似乎与使用全局变量有关,在 header 文件中定义函数,而不是使用#ifndef守卫......但据我所知,情况似 ...