Неквалифицированный поиск имени, объявленного в теле функции

Я столкнулся с определением объявления:

Объявление является определением, если оно не объявляет функцию без указания тела функции.

#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 внутри области действия функции не относится к глобальному a. Как это объяснить?


person Community    schedule 14.05.2014    source источник


Ответы (1)


1. Нет, это глобальный foo(). В main вы повторно объявляете имя, а не определяете его. Если бы существовало другое определение foo, то оно нарушило бы правило одного определения, и программа не компилировать.

2. Думаю, первый ответ также отвечает на этот вопрос. Существует только одно определение foo(), которое находится в глобальной области видимости. Таким образом, неквалифицированный поиск имени будет ссылаться на него.

ИЗМЕНИТЬ

В следующем примере вы определяете a в main, что скрывает глобальный a. Из вашей первой цитаты:

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

a не является функцией, поэтому объявление также является определением, которое скрывает предыдущее определение a.

person Rakib    schedule 14.05.2014
comment
@DmitryFucintv, посмотри развернутый ответ. - person Rakib; 14.05.2014