c ++中的一个定义规则

St.*_*rio 0 c++ one-definition-rule

根据c ++标准:

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

//--translation_unit.cpp--//
int a;

void foo()
{
    int a; //Second defention of a. ODR fails.
}
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*our 13

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

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