gpt4 book ai didi

c++ - 为什么这不会给出重新声明错误?

转载 作者:太空狗 更新时间:2023-10-29 23:35:54 26 4
gpt4 key购买 nike

我有这个代码 - http://ideone.com/8Q8XIo

#include <stdio.h>

int xyz = 10;
int main(void) {

int xyz = 20;//line 2
printf("%d",xyz);

return 0;
}

我的问题是 - 为什么它不给出重新声明错误?我知道第二次它在“主要”功能的范围内。但我认为在“第 2 行”中只执行 xyz = 20 就可以了,但 int xyz = 20 不行。

最佳答案

根据C标准(6.2.1标识符的范围)

  1. ...Within the inner scope, the identifier designates the entity declared in the inner scope; the entity declared in the outer scope is hidden (and not visible) within the inner scope.

在您的示例中,第一个声明的标识符

int xyz = 10;

有文件作用域。第二声明标识符

int xyz = 20;//line 2

具有包含在文件范围内的 block 范围。也就是说, block 作用域是相对于文件作用域的内部作用域。第二个声明的标识符将第一个声明的标识符隐藏在 block 范围内。

同样适用于 C++。只有 C++ 有命名空间,并且使用限定名称可以访问隐藏变量。例如

#include <iostream>

int xyz = 10;

int main() {

int xyz = 20;//line 2

std::cout << "xyz = " << xyz << ", ::xyz = " << ::xyz << std::endl;

return 0;
}

这里::之前的xyz表示全局命名空间。

请注意,您也可以在函数声明中为函数参数声明使用相同的名称。例如

void f( int xyz );

在这种情况下,此标识符具有函数原型(prototype)范围。您甚至可以声明一个与示例同名的标签

在 C 中

xyz:;
int xyz = 20;

或者在 C++ 中

xyz:
int xyz = 20;

在 C 语言中,标签也有自己的命名空间。所以这个声明在 C 中是有效的

xyz:;

struct xyz
{
int xyz;
};

int xyz = 20;

关于c++ - 为什么这不会给出重新声明错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26843320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com