首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++中的一个定义规则

c++中的一个定义规则
EN

Stack Overflow用户
提问于 2014-05-13 07:12:15
回答 4查看 2K关注 0票数 2

根据c++标准:

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

代码语言:javascript
复制
//--translation_unit.cpp--//
int a;

void foo()
{
    int a; //Second defention of a. ODR fails.
}

你能解释一下ODR的实际工作原理吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-05-13 07:13:33

这并不违反规则,因为您定义了两个不同的变量。它们具有相同的名称,但在不同的作用域中声明,独立的实体也是如此。每个定义都有一个定义。

函数作用域中的声明被称为隐藏全局命名空间中的声明。在函数中,非限定名a引用局部变量,而限定名::a引用全局变量。

票数 15
EN

Stack Overflow用户

发布于 2016-02-06 04:44:56

它们不违反ODR,因为它们具有不同的范围。

第一个a具有全局范围。

具有全局作用域(也称为文件范围)的变量在文件的定义点之后在整个文件中都是已知的。

第二个a具有局部范围。

一个具有局部作用域(也称为块作用域)的变量只在定义它的块中已知。

为了更清楚地了解C++的ODR,您应该研究的概念是:存储持续时间、范围和链接

票数 1
EN

Stack Overflow用户

发布于 2014-05-13 07:14:52

您没有再次定义a

您刚刚定义了一个新变量a。它只在函数中具有作用域,与原始作用域(它具有全局范围)无关,并且在函数中隐藏原始作用域。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23624844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档