C范围是否为同一实体重叠?

时间:2015-11-21 15:28:53

标签: c scope

示例代码如下,' 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
    }
}

由于

2 个答案:

答案 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?

我的理解是答案是两者,因为它们是同一变量的暂定定义。