Променливите, декларирани глобално, са външни или статични?

Проучих в c, че променливите, които използват ключова дума extern, са външно препращани
например:
Prog1.c
main(){
extern int a ;
a=2;
}

Prog2.c
int a=3;
тези две програми са успешно компилирани заедно. означава ли това, че променлива a в Prog2.c също има външна връзка (външна препратка)??

но е написано в dennis ritchie pg-195 раздел a4.1, че обектите, декларирани извън всички блокове, на същото ниво като дефинициите на функции, винаги са статични и мисля, че статичното означава вътрешно свързване, така че какво точно се случва в горната програма?


person akash    schedule 24.05.2013    source източник
comment
Във вашия случай не е статичен. вие препращате към глобален валиден, деклариран в prog2.c в prog1.c. Ако декларирате променливата във файл на същото ниво като функции и след това я използвате във вашите функции в същия файл, тя има статичен обхват.   -  person Jack    schedule 24.05.2013
comment
но мисля, че в prog2 a е деклариран на същото ниво, както всяка друга дефиниция на функция би била в него   -  person akash    schedule 24.05.2013


Отговори (2)


By default, an object or variable that is defined outside all blocks 
has static duration and external linkage. 

Статична продължителност означава, че обектът или променливата се разпределя при стартиране на програмата и се освобождава, когато програмата приключи. Външно свързване означава, че името на променливата е видимо извън файла, в който е декларирана променливата. Обратно, вътрешното свързване означава, че името не се вижда извън файла, в който е декларирана променливата.

person Dayal rai    schedule 24.05.2013
comment
искаш да кажеш, че статичната и вътрешната връзка са две различни неща? - person akash; 24.05.2013
comment
Когато декларирате променлива или функция във файловия обхват (глобален и/или пространство от имена), статичната ключова дума указва, че променливата или функцията има вътрешна връзка. - person Dayal rai; 24.05.2013
comment
така че променливата има ли вътрешна връзка? - person akash; 24.05.2013
comment
Не, променлива a има външна връзка, защото е там с ключова дума extern. Тя е локална за функция, така че трябваше да поставите extern, за да направите външна връзка за нея. Ако дефинирате променливата като globel, тя ще има външна връзка по подразбиране. - person Dayal rai; 24.05.2013

Ако използвате ключова дума extern, можете да използвате променливата, без да я декларирате в същия файл. Трябва да декларирате променливата в един файл и да я използвате във всички останали файлове (модули), като използвате ключовата дума extern.

По подразбиране глобалните променливи имат външна връзка, освен ако не бъдат променени чрез добавяне на статична ключова дума. Това ще помогне да се изяснят нещата.

person Aseem Bansal    schedule 24.05.2013
comment
static също означава вътрешна връзка, не е ли така? - person akash; 24.05.2013
comment
Моя грешка. Написах статично мислене за локални променливи, докато въпросът беше за глобални променливи. Да, статично означава вътрешна връзка. - person Aseem Bansal; 24.05.2013