0

我遇到过声明定义:

声明是一个定义,除非它声明一个函数而不指定函数的主体

#include <stdio.h>
void foo()
{
    printf("foo\n");

}



int main()
{
    void foo();
    foo();
}

在3.3中说

除非潜在范围包含另一个同名声明,否则声明的范围与其潜在范围相同。

问题 1.这是否意味着在我的情况下,当我们将 foo 重新声明为 main 函数时,重新声明的 foo 实际上表示的实体与声明为全局范围的 foo 表示的实体不同?

问题 2.为什么不合格的名称查找解析会给出一个由“全局”foo 表示的实体?

UPD:如果我们考虑以下

#include <stdio.h>
int a=42;

int main()
{
    int a;
    printf("%d\n",a); //Garbage
}

然后a在函数范围内没有表示 global a。怎么解释?

4

1 回答 1

1

1.不,它表示全局foo()。在main重新声明名称,而不是定义它。如果有 的另一种定义foo,那么它就会违反一个定义规则,并且程序将无法编译。

2.我猜第一个答案也回答了这个问题。的定义只有一个foo(),它在全局范围内。因此,不合格的名称查找将引用该名称。

编辑

在后面的示例中,您正在定义 ain main,它隐藏了 global a。从你的第一个报价:

A declaration is a definition unless it declares a function without specifying the function’s body

a不是函数,所以声明也是定义,隐藏了之前的定义a

于 2014-05-14T05:15:51.810 回答