C++重声明规则及对应代码示例判定问题咨询
C++ 重声明规则与代码示例判定
重声明的核心要求
参考C++ ISO 2020草案6.2节第一段内容:
声明(第9章)可向翻译单元引入一个或多个名称,或重声明先前声明引入的名称。若属于此情况,该声明会指定这些名称的解释和语义属性。
重声明不是仅要求名称相同,需要同时满足两个核心条件:
- 两个声明处于同一个作用域下
- 名称的核心语义属性(类型、链接属性等)完全一致
如果不满足上述条件,哪怕名称完全相同,也不属于重声明,而是全新的声明,会隐藏外层作用域的同名实体。
两段代码的判定结果
第一段代码
int main() { int a = 12; { char a; } }
内部块中的char a属于全新声明,不属于重声明:它处于独立的内层块作用域,与外层int a的作用域不同,且类型语义属性也不匹配,本质是在内层作用域创建了新的同名变量,会临时隐藏外层的int a。
第二段代码
int main() { int a = 12; { int a ; } }
内部块中的int a同样属于全新声明,不属于重声明:即使它和外层a的类型属性完全一致,但二者处于不同作用域,仍然是内层作用域新定义的独立变量,仅对外层a产生隐藏效果,不构成重声明。
补充:合法重声明示例
只有同一作用域下的同名同属性声明才属于重声明,如下:
extern int a; // 首次声明,外部链接的int变量 extern int a; // 合法重声明,同一作用域、语义属性完全匹配
如果同一作用域下同名声明语义属性不一致,会直接触发编译错误。
内容的提问来源于stack exchange,提问作者user15071942
相关产品推荐
相关产品推荐

