one-definition-rule相关内容
由于单一定义规则,在 C 或 C++ 中不允许对全局变量进行多重定义.但是,在 C++ 中,一个 const 全局变量可以在多个编译单元中定义而不会出错.这与 C 中的不同. 为什么 C++ 允许,而 C 不允许?与 C 相比,为什么 C++ 中 const 全局变量的用法和行为与非 const 全局变量有这种不同?C++ 和 C 在 const 方面发生了什么? 例如,这在 C++
..
所以我在 2 个独立的翻译单元中有这段代码: //a.cpp#include 内联 int func() { return 5;}诠释代理();int main() { printf("%d", func() + proxy());}//b.cpp内联 int func() { return 6;}int proxy() { return func();} 正常编译时结果为1
..
我是否违反了以下程序的单一定义规则? //foo.hpp#ifndef FOO_HPP_#define FOO_HPP_命名空间{内联 int foo() {返回 1;}}内联 int bar() {返回 foo();}#万一//EOF 和 //m1.cpp#include "foo.hpp"诠释 m1() {返回栏();}//EOF 和 //m2.cpp#include "foo.hp
..
标准似乎暗示如果变量不是odr-used(§3.2/3),则对变量的定义数量没有限制: 每个程序都应包含该程序中 odr 使用的每个非内联函数或变量的准确定义;无需诊断. 它确实说任何变量都不能在翻译单元中多次定义(第 3.2/1 节): 任何翻译单元不得包含任何变量、函数、类类型、枚举类型或模板的多个定义. 但我在整个程序中找不到对非 ODR 使用的变量的限制.那么为什么
..
我不确定我是否正确地问了这个问题,但让我解释一下. 首先,我阅读了这篇解释声明和定义之间区别的文章:http://www.cprogramming.com/declare_vs_define.html 其次,我从之前的研究中知道,在头文件中定义变量和函数是不好的做法,因为在链接阶段,您可能有多个同名定义,这会引发错误. 但是,为什么课程不会发生这种情况?根据另一个SO答案(定义和
..
我正在阅读这里的代码(中文).有一段代码是关于在 C 中测试全局变量的.变量 a 已在文件 t.h 中定义,该文件已包含两次.在文件 foo.c 中定义了一个带有一些值的 struct b 和一个 main 函数.在 main.c 文件中,定义了两个未初始化的变量. /* t.h */#ifndef _H_#定义_H_诠释一个;#万一/* foo.c */#include #i
..
是否可以在头文件中写入以下内容: inline void f () { std::function功能 = [] {};} 或 class C { std::function功能 = [] {};C () {} }; 我猜在每个源文件中,lambda 的类型可能不同,因此 std::function 中包含的类型(target_type 的结果会有所不同). 这是否违反了 ODR(一
..
这只是在 另一个问题. 显然,类模板中的成员函数只有在 ODR 使用时才会被实例化.有人可以解释一下这到底是什么意思.维基百科关于单一定义规则 (ODR) 的文章 没有提到“ODR 使用". 然而标准将其定义为 名称显示为潜在求值表达式的变量是 odr-used 除非它是满足以下要求的对象出现在常量表达式 (5.19) 和左值到右值中立即应用转换 (4.1). 在 [bas
..
我应该什么时候为 C++ 中的函数/方法编写关键字 inline? 看到一些答案后,一些相关的问题: 我什么时候应该不为 C++ 中的函数/方法编写关键字“内联"? 编译器何时不知道何时使函数/方法“内联"? 当为函数/方法编写“内联"时,应用程序是否多线程有关系吗? 解决方案 哦,天哪,我最讨厌的一个. inline 更像是 static 或 extern
..
这出现在我经常使用的几个图书馆中.参见,例如: 错误 SSL 存档符号表(运行 ranlib) 通过 ndk-build 构建 libcryptopp.a 时没有存档符号表(运行 ranlib) 在问题中,用户为 OpenSSL 和 Crypto++ 库创建了一个 Android.mk.痛点似乎是用户将 Android.mk 包装器添加到源代码中. 在Android之外,每个项
..
想象一下我有两个不同的翻译单位a.cpp #include双杠();模板T foobar(T t){返回t}int main(){std :: cout
..
考虑以下说明性示例 #include模板struct Base {static int const touch;根据() {(无效)触摸;}};templateint const Base :: touch = [] {std :: cout
..
链接包含不同版本的boost的静态cpp库和动态cpp库会违反ODR吗? 我正在开发iPhone应用程序.对于最终的可执行文件,我需要链接一个静态库libstatic1.a和一个动态框架libdyanamic1. libstatic1.a包含boost的某些版本,例如boost 1.x,而libdynamic1包含boost的另一个版本,例如boost1.y.现在将链接这两者的最终可执
..
也许是la脚的问题,但是我不明白!如果我在多个翻译单元(不同的.cpp)中包含 或 ,为什么它不破坏ODR?据我了解,每个.cpp的编译方式不同,因此将分别为每个目标文件生成vector的方法代码,对吗?因此,链接器应该检测到它并抱怨.即使不会(我怀疑这是模板的特例),当我将所有链接都链接在一起时,也会在每个单元中使用一个代码或一组不同的克隆代码吗? 解决
..
我正在尝试探究inline函数的含义,并偶然发现了这个问题.考虑这个小程序(演示): /* ---------- main.cpp ---------- */ void other(); constexpr int get() { return 3; } int main() { std::cout
..
我正在阅读有关“> 一个定义规则 .它说: 如果一个.cpp文件定义了 struct S {int x; }; 和其他.cpp文件 定义 struct S {int y; }; ,链接程序的行为 它们在一起是不确定的.通常用未命名解决 命名空间. 我不明白为什么&怎么是不确定的?有人能解释一下这背后的真正原因吗?如何使用未命名的名称空间解决它? 解决方案 就像它说的那样.您使用
..
我正在查看 github上的库,其中一个头文件中包含以下内容: class Util { public: static void log( const string& message ); static void log( const char* message ); template static inline string
..
我有以下代码: std::string F() { WideString ws = GetMyWideString(); std::string ret; StringUtils::ConvertWideStringToUTF8(ws, ret); return ret; } WideString是第三方类,StringUtils也是如此.他们对我来说是一个黑匣子.第二
..
头文件中定义的任何函数会自动内联吗? 如果我在类中声明一个函数并使用关键字inline给出外部定义,那么该函数会是inline吗?如果是这样,为什么这样做不违反法律,即在声明时将内联函数赋予主体? 解决方案 在类定义内定义的任何函数都是内联的.标记为inline的任何函数也是内联的. class C { int f() { return 3; } // inline
..
我想和你们分享一个奇怪的例子,我偶然发现了这个例子,这让我思考了两天. 要使此示例正常工作,您需要: 三角形虚拟继承(在成员函数getAsString()上) 覆盖虚拟函数的模板类(此处为Value::getAsString())的成员函数专用化 (自动)由编译器内联 您从一个模板类开始,该模板类实际上继承了一个通用接口,即一组虚拟函数.稍后,我们将专门介绍这些虚
..