Класс хранения глобальной переменной по умолчанию (компилятор gcc)?

Каков класс хранения глобальных переменных в C (компилятор GCC) по умолчанию?

Позвольте мне поделиться кодом, например:

int i; 

void f()
{ --statements--}

main()
{ --- set of statements--- }

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


person Doherty    schedule 01.11.2016    source источник
comment
Почему это должно быть конкретно для GCC? Разве язык не говорит, что это такое?   -  person Barmar    schedule 01.11.2016
comment
Насколько мне известно. между разными компиляторами есть некоторые различия. В формальных аргументах, таких как - ›int func (int x), x может быть зарегистрирован (в gcc) или автоматически (в turbo c) в зависимости от версии компилятора.   -  person Doherty    schedule 01.11.2016
comment
Что такое авто в Turbo C ??   -  person Jabberwocky    schedule 01.11.2016
comment
Параметры функции @Doherty не имеют абсолютно никакого отношения к продолжительности хранения и привязке переменных области видимости файла ... При этом все стандартные компиляторы ведут себя одинаково в любом случае.   -  person Lundin    schedule 01.11.2016
comment
@Lundin. Мне жаль. Я этого не понял. Не могли бы вы перефразировать это для меня?   -  person Doherty    schedule 03.11.2016


Ответы (2)


В этом коде i имеет статическую продолжительность хранения и внешнюю связь.

Продолжительность хранения означает время существования хранилища переменной. Длительность статического хранения означает, что переменная существует в течение всего времени существования программы.

Связь относится к отношениям между именами и объектами. Внешняя связь означает, что все экземпляры имени с внешней связью обозначают один и тот же объект. Ваш int i; будет соответствовать объявлению extern int i; из другой единицы перевода.

Ключевое слово static используется в разных контекстах как спецификатор продолжительности хранения и как спецификатор связи, поэтому непонятно, является ли переменная static. Вместо этого следует учитывать продолжительность хранения переменной и связь.

person M.M    schedule 01.11.2016
comment
Не могли бы вы поделиться примером, который показывает внешнюю связь по умолчанию? Я столкнулся с ошибкой связывания, когда запустил то же самое. - person Doherty; 04.11.2016
comment
И под внешней связью вы имели в виду, что к переменной можно получить доступ из другого написанного файла / программы? Или он будет доступен для функций в той же программе? - person Doherty; 04.11.2016
comment
@Doherty другие файлы в той же программе. Если у вас есть ошибка связывания, задайте новый вопрос с вашим точным кодом (и командой, которую вы использовали для компиляции и связывания). Но проверьте этот поток сначала, чтобы проверить, упоминается ли там проблема. - person M.M; 04.11.2016

У вас есть следующие случаи для переменных, объявленных вне какой-либо функции:

static int variableWithfileScope;  // Not exported. Only visible in current file.

int globalVariableThatIsExported;  // Exported. 

// Forward declaration. No variable defined.
extern int globalVariableThatIsDefinedSomewhereElse;  

Это определено стандартом и применимо ко всем компиляторам C.

person Klas Lindbäck    schedule 01.11.2016