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

Я изучал в C, что переменные, использующие ключевое слово extern, ссылаются извне,
например:
Prog1.c
main(){
extern int a ;
a=2;
}

Prog2.c
int a=3;
эти две программы успешно скомпилированы вместе. означает ли это, что переменная a в Prog2.c также имеет внешнюю связь (внешнюю ссылку) ??

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


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
Когда вы объявляете переменную или функцию в области файла (глобальной области и/или области пространства имен), ключевое слово static указывает, что переменная или функция имеет внутреннюю связь. - person Dayal rai; 24.05.2013
comment
так переменная имеет внутреннюю связь? - person akash; 24.05.2013
comment
Нет, переменная a имеет внешнюю связь, потому что она существует с ключевым словом extern. Она является локальной для функции, поэтому вам нужно было поместить extern, чтобы сделать для нее внешнюю связь. Если вы определяете переменную как глобус, по умолчанию она будет иметь внешнюю связь. - person Dayal rai; 24.05.2013

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

По умолчанию глобальные переменные имеют внешнюю связь, если только они не изменены путем добавления ключевого слова static. Это поможет прояснить ситуацию.

person Aseem Bansal    schedule 24.05.2013
comment
статика также означает внутреннюю связь, не так ли? - person akash; 24.05.2013
comment
Моя ошибка. Я написал статическое мышление о локальных переменных, в то время как вопрос был о глобальных переменных. Да, статика означает внутреннюю связь. - person Aseem Bansal; 24.05.2013