Две переменные с одинаковым именем и типом, в двух разных файлах .c, компилируются с помощью gcc - PullRequest
10 голосов
/ 25 августа 2011

Вот сделка. У меня было две одинаковые глобальные переменные в двух разных файлах .c, они не были объявлены как extern. Таким образом, каждый файл .c должен видеть свою собственную переменную, верно?

Но я получил довольно странное поведение, как будто один файл считывал переменную других файлов (после их объединения). Похоже, что добавление «статического» квалификатора к определениям обеих переменных решило эту проблему.

Так что же мне на самом деле интересно, что именно там произошло без квалификатора «static»?

Ответы [ 4 ]

18 голосов
/ 25 августа 2011

Таким образом, каждый файл .c должен был видеть свою собственную переменную, верно?

Неверно.В C пропуск static в объявлении означает неявную extern связь.

From C В двух словах:

Компилятор обрабатывает объявления функций без спецификатора класса хранения, как если быони включали спецификатор extern.Аналогично, любые идентификаторы объектов, которые вы объявляете вне всех функций и без спецификатора класса хранения, имеют external linkage.

4 голосов
/ 04 ноября 2014

ВСЕГДА инициализируйте глобальную переменную, тогда компилятор не будет автоматически рассматривать ее связь как внешнюю.Компилятор выдаст ошибку во время компиляции.

Это поможет избежать случайных проблем в большой базе кода, потому что наш код может использовать другую объявленную переменную, которая имеет какое-то случайное значение (в нашей логической перспективе)

1 голос
/ 01 апреля 2014
Выходной файл

создается путем создания объектного файла из отдельного файла и последующего связывания их с помощью компоновщика.Теперь, когда у вас есть одинаковая переменная в двух разных файлах, отдельный файл будет скомпилирован без ошибок, но во время компоновки компоновщик получит два определения переменной и выдаст ошибку.Но в случае статической области видимости обе переменные ограничены для файла, так что все работает нормально.Я надеюсь, вы найдете это полезным.

0 голосов
/ 25 августа 2011

Насколько я знаю, когда вы не указываете ни static, ни extern, тогда выбор за компилятором. И gcc в этом случае идет на extern, поэтому вы должны указать static в вашем случае.

У меня была такая же проблема, несколько лет назад: -)

...