Почему глобальная статическая переменная имеет приоритет над внешней внутри функции?

это сложно объяснить в тексте, поэтому я приведу пример.

//f1.c
int a = 5;

int main()
{
    printf("func2() output is: %i\n", func2() );
    return 0;
}


//f2.c
static int a = 3

int func2()
{
    extern int a;
    return a;
}

Когда я компилирую и запускаю это, я получаю 3, хотя ожидал 5. Может ли кто-нибудь объяснить мне, почему я получаю 3? Я бы подумал, что при использовании extern внутри функции не будет использоваться значение статической переменной.


person Community    schedule 27.03.2013    source источник
comment
Ну, потому что так это определено в стандарте.   -  person    schedule 28.03.2013


Ответы (2)


Из n1256 §6.2.2 ¶4:

Для идентификатора, объявленного со спецификатором класса хранения extern в области, в которой видно предыдущее объявление этого идентификатора, если предыдущее объявление указывает внутреннюю или внешнюю связь, связь идентификатора в более позднем объявлении такая же, как связь указывается в предварительном заявлении. Если предыдущее объявление не видно или если предыдущее объявление не указывает на связь, то идентификатор имеет внешнюю связь.

Таким образом, extern в области действия функции означает, что переменная имеет внешнюю связь по по умолчанию, но если есть другое видимое определение, вместо него используется это определение.

person Dietrich Epp    schedule 27.03.2013

Модификатор класса static означает, что переменная будет видна только в этой единице перевода (f2.c). Используя extern вместо a, вы только объявили эту переменную, но не определили ее. Тем не менее, в единице перевода f2.c был доступен a, поэтому будет использоваться этот.

person bash.d    schedule 27.03.2013