one-definition-rule相关内容

为什么在 C++ 中允许对 const 全局变量进行多重定义,而在 C 中却不允许?

由于单一定义规则,在 C 或 C++ 中不允许对全局变量进行多重定义.但是,在 C++ 中,一个 const 全局变量可以在多个编译单元中定义而不会出错.这与 C 中的不同. 为什么 C++ 允许,而 C 不允许?与 C 相比,为什么 C++ 中 const 全局变量的用法和行为与非 const 全局变量有这种不同?C++ 和 C 在 const 方面发生了什么? 例如,这在 C++ ..
发布时间:2022-01-23 23:52:23 C/C++开发

如果我不使用变量,我可以在翻译单元中有多个定义吗?

标准似乎暗示如果变量不是odr-used(§3.2/3),则对变量的定义数量没有限制: 每个程序都应包含该程序中 odr 使用的每个非内联函数或变量的准确定义;无需诊断. 它确实说任何变量都不能在翻译单元中多次定义(第 3.2/1 节): 任何翻译单元不得包含任何变量、函数、类类型、枚举类型或模板的多个定义. 但我在整个程序中找不到对非 ODR 使用的变量的限制.那么为什么 ..
发布时间:2022-01-11 15:20:53 C/C++开发

为什么在头文件中定义类时没有多重定义错误?

我不确定我是否正确地问了这个问题,但让我解释一下. 首先,我阅读了这篇解释声明和定义之间区别的文章:http://www.cprogramming.com/declare_vs_define.html 其次,我从之前的研究中知道,在头文件中定义变量和函数是不好的做法,因为在链接阶段,您可能有多个同名定义,这会引发错误. 但是,为什么课程不会发生这种情况?根据另一个SO答案(定义和 ..
发布时间:2022-01-11 15:12:07 C/C++开发

C 不同文件中定义的同一个全局变量

我正在阅读这里的代码(中文).有一段代码是关于在 C 中测试全局变量的.变量 a 已在文件 t.h 中定义,该文件已包含两次.在文件 foo.c 中定义了一个带有一些值的 struct b 和一个 main 函数.在 main.c 文件中,定义了两个未初始化的变量. /* t.h */#ifndef _H_#定义_H_诠释一个;#万一/* foo.c */#include #i ..
发布时间:2022-01-11 15:10:37 其他开发

“ODR 使用"是什么意思?某物?

这只是在 另一个问题. 显然,类模板中的成员函数只有在 ODR 使用时才会被实例化.有人可以解释一下这到底是什么意思.维基百科关于单一定义规则 (ODR) 的文章 没有提到“ODR 使用". 然而标准将其定义为 名称显示为潜在求值表达式的变量是 odr-used 除非它是满足以下要求的对象出现在常量表达式 (5.19) 和左值到右值中立即应用转换 (4.1). 在 [bas ..
发布时间:2021-12-13 18:21:52 C/C++开发

我什么时候应该为函数/方法编写关键字“内联"?

我应该什么时候为 C++ 中的函数/方法编写关键字 inline? 看到一些答案后,一些相关的问题: 我什么时候应该不为 C++ 中的函数/方法编写关键字“内联"? 编译器何时不知道何时使函数/方法“内联"? 当为函数/方法编写“内联"时,应用程序是否多线程有关系吗? 解决方案 哦,天哪,我最讨厌的一个. inline 更像是 static 或 extern ..
发布时间:2021-12-01 14:54:12 C/C++开发

如何在通过 Android.mk 构建的存档上运行 ranlib?

这出现在我经常使用的几个图书馆中.参见,例如: 错误 SSL 存档符号表(运行 ranlib) 通过 ndk-build 构建 libcryptopp.a 时没有存档符号表(运行 ranlib) 在问题中,用户为 OpenSSL 和 Crypto++ 库创建了一个 Android.mk.痛点似乎是用户将 Android.mk 包装器添加到源代码中. 在Android之外,每个项 ..
发布时间:2021-11-17 03:12:35 移动开发

链接静态和动态库时违反ODR

链接包含不同版本的boost的静态cpp库和动态cpp库会违反ODR吗? 我正在开发iPhone应用程序.对于最终的可执行文件,我需要链接一个静态库libstatic1.a和一个动态框架libdyanamic1. libstatic1.a包含boost的某些版本,例如boost 1.x,而libdynamic1包含boost的另一个版本,例如boost1.y.现在将链接这两者的最终可执 ..
发布时间:2021-04-22 18:43:10 移动开发

为什么要使用C ++的< vector>模板化类不会违反一个定义规则?

也许是la脚的问题,但是我不明白!如果我在多个翻译单元(不同的.cpp)中包含 或 ,为什么它不破坏ODR?据我了解,每个.cpp的编译方式不同,因此将分别为每个目标文件生成vector的方法代码,对吗?因此,链接器应该检测到它并抱怨.即使不会(我怀疑这是模板的特例),当我将所有链接都链接在一起时,也会在每个单元中使用一个代码或一组不同的克隆代码吗? 解决 ..
发布时间:2021-04-19 19:36:46 C/C++开发

C ++对一个定义规则的困惑

我正在阅读有关“> 一个定义规则 .它说: 如果一个.cpp文件定义了 struct S {int x; }; 和其他.cpp文件 定义 struct S {int y; }; ,链接程序的行为 它们在一起是不确定的.通常用未命名解决 命名空间. 我不明白为什么&怎么是不确定的?有人能解释一下这背后的真正原因吗?如何使用未命名的名称空间解决它? 解决方案 就像它说的那样.您使用 ..
发布时间:2020-07-02 01:38:19 C/C++开发

内联函数以及类和头文件

头文件中定义的任何函数会自动内联吗? 如果我在类中声明一个函数并使用关键字inline给出外部定义,那么该函数会是inline吗?如果是这样,为什么这样做不违反法律,即在声明时将内联函数赋予主体? 解决方案 在类定义内定义的任何函数都是内联的.标记为inline的任何函数也是内联的. class C { int f() { return 3; } // inline ..
发布时间:2020-07-02 01:37:08 C/C++开发

内联导致忽略虚拟函数的模板类的专用成员函数被忽略

我想和你们分享一个奇怪的例子,我偶然发现了这个例子,这让我思考了两天. 要使此示例正常工作,您需要: 三角形虚拟继承(在成员函数getAsString()上) 覆盖虚拟函数的模板类(此处为Value::getAsString())的成员函数专用化 (自动)由编译器内联 您从一个模板类开始,该模板类实际上继承了一个通用接口,即一组虚拟函数.稍后,我们将专门介绍这些虚 ..
发布时间:2020-07-02 01:36:06 C/C++开发