示例代码如下,' a'是文件范围:
1 ...
2 int a;
3 int a;
4 ... // which 'a' is visible?
我知道' a'是为了同一个对象。但是每个标识符都有一个范围,两个标识符的范围是' a'应该在第4行重叠,哪一个可见?如果第二个' a'仅可见,这是否意味着这种情况如下:
{
int a;
{
int a; // the scope of the first 'a' is hidden
}
}
由于
答案 0 :(得分:2)
在文件范围内,类似
int a;
首先是声明。它也是tentative definition。对于相同的名称,您可以使用相同名称的暂定定义 iff 它们在技术上(请参阅链接以获取详细信息)相同。
但是,如果添加初始化程序:
int a = 0;
您有(常规)定义。其中你只能有一个同名。它也必须与所有暂定定义相同。
第二个例子是关于范围。您可以在不同的范围中使用相同的名称。但是,如果引用该对象,将使用最内层的名称。无法在外部作用域中访问具有相同名称的对象。这称为 shadowing ,正确配置的编译器(即启用警告)应警告它,但允许这样做。
通常这是一种糟糕的编码风格,因为在阅读代码时必须检查范围以查看声明。 (这就是编译器应该警告的原因)。请注意,内部定义甚至不需要具有相同的类型。
答案 1 :(得分:0)
解释this answer:
在全局范围内,您编写的内容可以正常工作(它会在函数范围内引发错误)。也就是说,你写下以下内容:
int a;
int a;
int main(...){...}
这样编译正常,但只是因为a
都没有初始化。如果您多次声明带有作业的,事情就会中断。这是一个例子:
int a;
int a; // No problem yet
int a = 10; // a is now initialized
int a = 12; // Error: Redefinition of a
前两个定义(以及您提供的那种)是所谓的暂定定义。 C规范说这些中的多个被视为冗余。重要的是每个都有零或一个带初始化的定义。
最后,回答你的问题:
...
int a;
int a;
... // which 'a' is visible?
我的理解是答案是两者,因为它们是同一变量的暂定定义。