Защо глобалната статична променлива има предимство пред extern в рамките на функция?

това е трудно да се обясни в текст, затова ще дам пример.

//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, вие само сте декларирали тази променлива, но не сте я дефинирали. И все пак имаше a на разположение в модула за превод f2.c, така че този ще бъде използван.

person bash.d    schedule 27.03.2013