根据c++标准:
任何转换单元都不得包含任何变量、函数、类类型、枚举类型或模板的多个定义。
//--translation_unit.cpp--//
int a;
void foo()
{
int a; //Second defention of a. ODR fails.
}你能解释一下ODR的实际工作原理吗?
发布于 2014-05-13 07:13:33
这并不违反规则,因为您定义了两个不同的变量。它们具有相同的名称,但在不同的作用域中声明,独立的实体也是如此。每个定义都有一个定义。
函数作用域中的声明被称为隐藏全局命名空间中的声明。在函数中,非限定名a引用局部变量,而限定名::a引用全局变量。
发布于 2016-02-06 04:44:56
它们不违反ODR,因为它们具有不同的范围。
第一个a具有全局范围。
具有全局作用域(也称为文件范围)的变量在文件的定义点之后在整个文件中都是已知的。
第二个a具有局部范围。
一个具有局部作用域(也称为块作用域)的变量只在定义它的块中已知。
为了更清楚地了解C++的ODR,您应该研究的概念是:存储持续时间、范围和链接
发布于 2014-05-13 07:14:52
您没有再次定义a。
您刚刚定义了一个新变量a。它只在函数中具有作用域,与原始作用域(它具有全局范围)无关,并且在函数中隐藏原始作用域。
https://stackoverflow.com/questions/23624844
复制相似问题