欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > c/c++ >内容正文

c/c++

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

发布时间:2024/10/8 c/c++ 48 豆豆
生活随笔 收集整理的这篇文章主要介绍了 c语言程序中unit怎么定义,c ++中的一个定义规则(One definition rule in c++) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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输出流,

...

与50位技术专家面对面20年技术见证,附赠技术全景图

总结

以上是生活随笔为你收集整理的c语言程序中unit怎么定义,c ++中的一个定义规则(One definition rule in c++)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。