在局部作用域使用extern取消全局变量名称遮蔽是否符合C/C++标准?
嵌套局部作用域extern声明的合法性解答
这种用法是合法且有C++标准明确定义的,你给出的示例代码运行行为完全符合标准要求。
核心规则说明
- C++标准明确规定:在块作用域中使用
extern声明变量时,该声明引入的名称会关联到全局命名空间中具有外部链接的对应变量,且该声明会在当前作用域内遮蔽外层的同名局部变量。 - 你示例中的执行逻辑完全符合上述规则:
- main函数内定义的局部变量
int a = 2先遮蔽了全局变量a,因此嵌套块内第一处cout << a << endl输出外层局部变量的值2 cout << ::a << endl显式指定访问全局命名空间的a,输出全局变量的值1- 嵌套块内执行
extern int a声明后,当前块作用域内的名称a就被绑定到全局外部变量a,后续所有对a的访问都会指向全局变量,因此第三处cout << a << endl输出1
- main函数内定义的局部变量
补充注意点
此处的extern int a属于变量声明而非定义,只要全局作用域中存在a的有效定义(可以在当前文件,也可以在其他翻译单元,和你注释标注的场景完全兼容),链接阶段就不会出现问题。
示例代码回顾
int a = 1; // 可能定义在其他文件中 void main() { int a = 2; // 遮蔽全局变量 { cout << a << endl; // 输出2 cout << ::a << endl; // 显然输出1 extern int a; cout << a << endl; // 同样输出1 } }
内容的提问来源于stack exchange,提问作者Gonen I
相关产品推荐
相关产品推荐

