c ++中的一个定义规则(One definition rule in c++)

根据c ++标准:

任何翻译单元都不得包含任何变量,函数,类类型,枚举类型或模板的多个定义。

//--translation_unit.cpp--//

int a;

void foo()

{

int a; //Second defention of a. ODR fails.

}

你能解释一下ODR实际上是如何运作的吗?

According to the c++ standard:

No translation unit shall contain more than one definition of any variable, function, class type, enumeration type, or template.

//--translation_unit.cpp--//

int a;

void foo()

{

int a; //Second defention of a. ODR fails.

}

Can you explain me how ODR does work actually?

原文:https://stackoverflow.com/questions/23624844

更新时间:2019-12-11 06:16

最满意答案

这不会破坏规则,因为您定义了两个不同的变量。 它们具有相同的名称,但在不同的范围内声明,因此是单独的实体。 每个都有一个单一的定义。

据说函数范围中的声明隐藏了全局命名空间中的声明。 在函数内, 非限定名称 a引用局部变量,而限定名称 ::a引用全局。

This doesn't break the rule because you define two different variables. They have the same name, but are declared in different scopes, and so are separate entities. Each has a single definition.

The declaration in the function's scope is said to hide the one in the global namespace. Within the function, the unqualified name a refers to the local variable, while the qualified name ::a refers to the global.

2014-05-13

相关问答

事实是在标准中(3.2一个定义规则): 任何翻译单元都不得包含任何变量,函数,类类型,枚举类型或模板的多个定义。 [...] 每个程序应该包含该程序中使用的每个非内联函数或对象的一个定义; 不需要诊断。 定义可以在程序中显式出现,它可以在标准库或用户定义的库中找到,或者(在适当的时候)它被隐式定义(见12.1,12.4和12.8)。 内联函数应在使用它的每个翻译单元中定义。 The truth is in the standard (3.2 One definition rule) : No tr

...

这不会破坏规则,因为您定义了两个不同的变量。 它们具有相同的名称,但在不同的范围内声明,因此是单独的实体。 每个都有一个单一的定义。 据说函数范围中的声明隐藏了全局命名空间中的声明。 在函数内, 非限定名称 a引用局部变量,而限定名称 ::a引用全局。 This doesn't break the rule because you define two different variables. They have the same name, but are declared in differe

...

有时,位的位置代表一些位操作,如您的情况: #define DSF_OVER (1<<0) is 1

#define DSF_DISPLAY (1<<1) is 2

#define DSF_CALLFLOW (1<<2) is 4 (This is not 3)

如果您稍后要添加新项目,则可以执行此操作 #define DSF_OVER 1

#define DSF_DISPLAY 2

#define DSF_CALLFLOW 4

#

...

这些是不同的问题。 关于const 从标准(如果太长,只读粗体部分): 非静态成员函数 [...]非静态成员函数可以声明为const,volatile或const volatile。 这些cv限定符会影响this指针的类型(9.3.2)。 它们还影响成员函数的函数类型(8.3.5); 一个成员函数声明const是一个const成员函数 ,一个成员函数声明volatile是一个volatile成员函数,一个成员函数声明const volatile是一个const volatile成员函数。 [...

...

ifstream::in

是ios_base::in的别名ios_base::in其中ios_base类型为ios_base::openmode类中的静态成员。 这允许您指定打开模式。 范围运算符不仅适用于名称空间,还适用于类/结构,因为它们具有自己的范围。 因此, somename:: ,这里somename可以是命名空间,也可以是类/结构,它可以拥有可以通过作用域运算符访问的静态成员: somename::foo 。 ifstream::in

Is an alias for ios_bas

...

典型情况。 如果extern "C" double log(double)最初在全局命名空间中声明,那么您已重新声明它并提供了一个定义。 该实现之前提到的extern "C"继续进行匹配的重新声明。 您的定义适用于属于该实现的函数,并且它是ODR违规。 至于UB的表现:将log视为弱链接符号显然很常见。 您的实现libc.so根据ABI规则覆盖libc.so (如果实现不执行extern "C" ,它仍然基本上都是相同的。) 其他可能的情况。 如果在namespace std声明了log ,然后将

...

[basic.def.odr] / 1: 任何翻译单元都不得包含任何变量,函数,类类型,枚举类型或模板的多个定义。 变量由[basic] / 6定义: 通过声明除非静态数据成员或对象之外的引用引入变量 。 因此,由于非静态数据成员不是变量,函数,类,枚举或模板,因此单一定义规则不适用于非静态数据成员。 [basic.def.odr]/1: No translation unit shall contain more than one definition of any variable, func

...

就像它说的那样。 您使用不同的定义两次定义了相同的类S 该语言的制造者宣称你不会这样做 。 原因是允许它显然是荒谬的,并导致您的翻译单元之间的兼容性中断。 哪个定义是“正确的”? 您的编译器应该使用哪个? 一个未命名的命名空间导致两个定义实际上定义了不同的类S ,它们被正确地命名为类似于my-anonymous-namespace-1::S和my-anonymous-namespace-2::S ,尽管你永远不能引用它们这样,因为名称空间是匿名的。 It's just as it says. Yo

...

如果cppreference.com不同意C ++标准的实际文本,则cppreference.com是错误的。 唯一可以取代标准文本的是该标准的新版本,以及缺陷报告的官方解决方案 (有时会汇总到称为“技术corrigienda”的文档中,这是一个很小的版本标准)。 但是,在这种情况下,您误解了“输入和输出操作”对cppreference.com的意义。 (如果内存服务,则该文本将从标准的旧版本逐字逐句获取。)存储器的存储不是输出操作。 只有写入文件 (即任何stdio.h或iostream输出流,

...

c语言程序中unit怎么定义,c ++中的一个定义规则(One definition rule in c++)相关推荐

  1. 霸气C语言程序,霸气,C语言程序员犀利回应。又双叒一个工程师倒下了

    原标题:霸气,C语言程序员犀利回应.又双叒一个工程师倒下了 "程序员是如何被逼死的?改三次需求就可以了" 改一次可能总个框架都要变,前面做的就白做了.改三次需求自行了断了 先送你们 ...

  2. adc0804c语言程序,ADC0804芯片在模数转换电路中的应用研究

    [摘 要]本文论述了ADC0804芯片在模数转换电路中的软硬件设计方法.制作了ADC0804的数据采集电路,并将其挂载于单片机系统,通过驱动发光二极管点亮的方式验证了电路设计的正确性,并给出了电路图和 ...

  3. c语言程序里 n什么意思,英语中的n是什么意思

    介词短语作定语--认识"我"的两种方式,在这一部分要介绍给大家的是作定语的介词短语. (1)何为"介词"及"介词短语" 语法书中对介词的定义 ...

  4. 引入线程的c语言程序,在引入线程的操作系统中,资源分配的基本单位是____。A.线程;B.进程;C.作业;D.程序;...

    What is a group of Musicians called? 加速毒物从尿中排泄常选用 158. 在CNKI中,欲检索"从法律角度探究转基因食品安全事件应对机制"的文献 ...

  5. c语言程序画正八边形,用少儿编程绘制一个正九边形

    机械制图中正九边形的画法 是手工画吗?下面就是手工绘制正九边形的方法: 在word里面如何绘制正规9边形?(急)!!! 我刚才也看了一下,好像确实没有. 你可以用CAD画九边形,再插入到WORD中. ...

  6. c语言程序编写字体,c语言程序设计练习题

    c语言程序设计练习题 篇一:c语言程序设计基础单元总结与练习题及答案 <C语言程序设计>单元总结与练习题 答 案 单元一 程序设计宏观认识 单元总结提升 本单元中,核心内容有C语言程序框架 ...

  7. 培训c语言程序,编程人员培训手册C语言程序设计基础

    <编程人员培训手册C语言程序设计基础>由会员分享,可在线阅读,更多相关<编程人员培训手册C语言程序设计基础(18页珍藏版)>请在人人文库网上搜索. 1.第2章:C语言程序设计基 ...

  8. 大小写看作相同c语言,C语言程序设计基础.ppt

    <C语言程序设计基础.ppt>由会员分享,可在线阅读,更多相关<C语言程序设计基础.ppt(30页珍藏版)>请在人人文库网上搜索. 1.第一章 C语言程序设计基础,一.计算机工 ...

  9. 滑动平均滤波c语言_11种经典软件滤波算法及其波形效果图(附C语言程序)

    (后页附带C语言程序) 注意注意注意:(图像中红线都是经过滤波的)1.限幅滤波法(又称程序判断滤波法) A.方法: 根据经验判断,确定两次采样允许的最大偏差值(设为 A) 每次检测到新值时判断: 如果 ...

最新文章

  1. PHP学习笔记-PHP与Web页面的交互2
  2. PHP带重试功能的curl
  3. 毕加索发布轻量化转化引擎及BIMSOP协作云平台
  4. 云炬Android开发笔记 12基于WebView的混合App框架设计(包含浏览器与原生请求Cookie的处理)
  5. 使用jupyter notebook连接服务器进行远程写代码
  6. leetcode 47. 全排列 II 思考分析
  7. 跳出多重循环_代码里的俄罗斯套娃 | 07 多重循环
  8. 系统级程序设计结课实验-第一部分
  9. 《深入理解Hadoop(原书第2版)》——3.4第一个Hadoop程序
  10. Vector和Arraylist的区别
  11. 基于RV1126平台imx291分析 --- 回顾之前的注册
  12. 计算机中的文件及文件命名规则,文件名的命名规则是什么
  13. Vue——v-show的使用——2020.11.18
  14. 文本识别综述 <软件学报_王建新等、中国图象图形学报_刘崇宇等>
  15. IE8跳转谷歌浏览器亲测有效
  16. Python开发《外星人入侵》游戏项目,付详细代码和注释
  17. java lint_提高你的代码稳定性与可读性-lint工具
  18. Java用最少代码实现五子棋-玩家对战模式-人机对战模式-电脑策略对战
  19. 经典不等式链的一些拓展理解
  20. 安全模式没有计算机图标不见了怎么办,win10杀毒图标不见了怎么办?win10安全中心图标没了的处理方法...

热门文章

  1. 2.2.5 操作系统之调度算法(时间片轮转调度算法、优先级调度算法、多级反馈队列调度算法)
  2. matlab梯度检测,Matlab:关于梯度的一阶导数边缘检测
  3. 不含抽象方法的抽象类 java_Java:抽象类继承非抽象类,且不包含抽象方法有何负面作用吗?...
  4. windows。forms.timer设置第一次不等待_防火卷帘设置的场景不同下降的要求有哪些区别?...
  5. 启明云端分享| ESP32-S3 + 480*480分辨率的2.1寸圆屏旋钮方案
  6. 服务器远程显示用户忙,服务器远程显示用户忙
  7. python合并excel文件关键字_python合并多个excel文件的示例
  8. 以太网接口保护方案设计图
  9. matlab驱动器有什么用,mongo-matlab-driver如何使用
  10. python异常处理时所使用的保留字_Python中,下列哪个保留字不用于异常处理______________。_学小易找答案...