one-definition-rule相关内容
我正在一个项目中,该项目具有一个“ util”库,其中包含诸如日志记录,断言处理等内容。此库被编译为一个静态库,并添加了 -fPIC 。我还有一个插件系统,其中的插件是在运行时通过 dlopen 加载的共享库。这些插件和主要可执行文件都使用静态util库。 问题:现在我得到 AddressSanitizer:odr-violation 错误。问题是 size = 40'stdStreamWr
..
我想用scipy.odr执行多维ODR.我阅读了API文档,它说多维是可能的,但我无法使其起作用.我在互联网上找不到有效的示例,API真的很粗糙,也没有给出如何进行操作的提示. 这是我的MWE: import numpy as np import scipy.odr def linfit(beta, x): return beta[0]*x[:,0] + beta[1]*x[
..
我不确定我是否正确提出了这个问题,但请允许我解释一下. 首先,我阅读了这篇文章,解释了声明和定义之间的区别: http://www.cprogramming.com/declare_vs_define.html 第二,我从以前的研究中得知,在头文件中定义变量和函数是不明智的做法,因为在链接阶段,您可能对同一个名称有多个定义,这将引发错误. 但是,为什么这在课堂上没有发生?根据另一
..
该标准似乎暗示着,如果不是 odr用过的(第3.2/3节),则对变量的定义数量没有限制: 每个程序应准确地包含该程序中使用的每个非内联函数或变量的一个定义;无需诊断. 它确实说不能在翻译单元(第3.2/1节)中多次定义任何变量: 任何变量,函数,类类型,枚举类型或模板的翻译单元均不得包含多个定义. 但是我找不到整个程序中非奇数变量的限制.那么为什么我不能编译如下内容:
..
是main()函数是使用过 ?例如,在这样的简单程序中: int main() { } 解决方案 不,不是.不在您的简单程序中. [basic.def.odr] 3 一个函数的名称显示为潜在评估 如果表达式是唯一的查找结果或 一组重载函数([basic.lookup], [over.match],[over.over]),除非它是纯虚函数并且 其名称未明确限定,或者该表达式
..
根据 cppref ,inline函数的身份特征具有多个翻译单位如下: ... 2)每个翻译单元中的地址都相同. 3)所有函数定义中的局部函数静态对象为 在所有翻译单元之间共享(它们都引用同一个对象 在一个翻译单元中定义) ... 简而言之,暗含一个单身身份. 我想知道对于没有指定符的功能模板实例化是否同样适用. 解决方案 我想知道对于没有内联说明符
..
DR 712 负责将C ++ 11中[basic.def.odr]/2的措辞更改为今天的当前措辞,即 712.条件表达式的整数常量操作数是否被“使用"? 在描述类内部初始化的静态数据成员时 定义,9.2.3.2 [class.static.data]第3段说, 如果使用该成员,则仍应在名称空间范围内对其进行定义 在程序中... 3.2 [basic.def.odr]第1段中“已
..
在 cppref 中说, 如果将非内联变量的初始化(自C ++ 17起)推迟在main/thread函数的第一条语句之后进行,则它在任何函数的第一次odr-use之前发生具有与待初始化变量相同的转换单元中定义的静态/线程存储持续时间的变量. 然后提供了延迟动态初始化的示例: // - File 1 - #include "a.h" #include "b.h" B b; A::A
..
在Visual Studio中,您可以为单个cpp文件设置不同的编译器选项.例如:在“代码生成"下,我们可以在调试模式下启用基本的运行时检查.或者我们可以更改浮点模型(精确/严格/快速).这些只是示例.有很多不同的标志. 一个内联函数可以在程序中定义多次,只要定义相同即可.我们将此函数放在标头中,并将其包含在多个翻译单元中.现在,如果不同cpp文件中的不同编译器选项导致该函数的编译代码略有不
..
根据Sergey Ryazanov,他的不可能是快速C ++代表不具有可比性: 我的代表无法比较.未定义比较运算符,因为委托不包含指向方法的指针.存根函数的指针在各种编译单元中可能不同. 读者回答了以下内容: “存根函数的指针在各种编译单元中可能有所不同." AFAIK,这是不正确的.要求编译器重新使用在不同编译单元中生成的模板函数(我敢肯定-但我认为Borland曾经违反了此规
..
根据 [temp.spec]/5 : 对于给定的模板和给定的模板参数集, ... 在程序中最多只能定义一个显式专业化(根据 ... 类模板的显式(完全)专业化的定义不能放在标头中(否则,每个包含该标头的翻译单元中都有一个定义,因此在整个程序中将有多个定义). 此外,作为另一个证据, [ basic.def.odr]/12 (在下面的方框中引用)不包含类模板的完全专业
..
我确实了解ODR所说的话,但是我不明白它试图达到什么目的. 我看到违反它的两个后果-用户将收到语法错误,这是完全可以的.而且可能还会出现一些致命的错误,并且该用户将再次是唯一一个有罪的人. 作为违反ODR并得到一些致命错误的示例,我想像这样: a.cpp struct A { int a; double b; }; void f(A a) {
..
考虑我的小例子C库: #include void some_function(void) { external_library_call(); //做其他的东西... } 它计划制作some_function()公开可调用。但是,该库不起作用,因为它需要的外部库也恰好使用了一个名为some_function()的
..
我对 const 成员的 static 类内初始化有点困惑。例如,在下面的代码中: #include struct Foo { const static int n = 42; }; // const int Foo :: n; //无ODR void f(const int& param) { std :: cout
..
所以我有两个单独的翻译单元中的代码: // a.cpp #include
..
我有一个定义一些数组的类。 Points.hpp class Points { public: static constexpr std :: array a1 = {{ +0.0}}; static constexpr std :: array a2 = {{ -1.0 / std :: sqrt(3.0), +1.0 / std ::
..
对于未初始化的模板类的静态数据成员,存在一些问题。很遗憾,这些都没有能够帮助我处理具体问题的答案。 我有一个模板类,它有一个静态数据成员,类型(即,必须是专门的)。如果不是这样,使用不同的模板函数应该会导致链接器错误。 以下是一些代码: #include template 类实例化{ public: static实例
..
单一定义规则规定: 在整个程序中,对象 或非内联函数不能有多个定义。 (从 维基百科) 好吧,我知道如果一个成员函数在头文件中定义, ,和ODR确定。 但是虚拟函数呢?我们知道,如果一个虚函数被称为多态,它不能被内联。如果这样的虚拟函数在头文件中定义,那么是否会违反ODR? 例如: // derived.hpp #include c
..
在N4296,3.2 [basic.def.odr] p3: 变量 x ex 是由 ex - 到-rvalue转换为 x 产生一个不调用任何非平凡函数的常量表达式,如果 x 是一个对象, ex 是表达式 e 的一组潜在结果的一个元素,其中lvalue-对 e 应用到值转换,或者 e 是丢弃值表达式。 如何解释这一段?我发现了两个解释。 1从这里“ 或 必须满足以下所有
..
请考虑以下代码: const int a = 0; const std :: string b =“hi”; inline void f_a1() { std :: cout
..