Почему переменная не может быть определена дважды в 2 файлах на C

Почему у меня не может быть int a; в 2 файлах C. Я собираюсь объединить оба, чтобы сделать исполняемый файл. По опыту знаю, что не могу, но я хочу найти, где это сказано в стандарте C99, и закрепить свое понимание.

Я читаю стандарт ISO C99 из http://www.open-std.org /jtc1/sc22/wg...docs/n1256.pdf . На странице 42 написано:

6.2.2 Связи идентификаторов

1 Идентификатор, объявленный в разных объемах или в том же объеме более чем один раз можно использовать для обозначения того же объект или функция с помощью процесса, называемого связь. Существует три вида связь: внешняя, внутренняя и отсутствует.

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

3 Если объявление области видимости файла идентификатор объекта или функции содержит спецификатор класса хранения статический, идентификатор имеет внутреннюю связь.

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

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

Прочитав это, я понял, что если я объявлю переменную вида say int a; в 2 исходных файлах. то оба имеют внешнюю связь согласно правилу 5 и 4. а затем согласно правилу 2 оба должны ссылаться на один и тот же объект. Тогда почему компилятор создает проблему. В стандарте намекают, что мы не можем объявить подобное в двух исходных файлах, и это должно вызвать ошибку компиляции. Во-первых, где в стандарте сказано, что int a - это определение, а затем где говорится, что 2 экземпляра определений неприемлемы. Я знаю, что это недопустимо по своему опыту, но было бы очень полезно для меня, если бы я смог найти это в стандарте и закрепить свое понимание.

Являются ли следующие выдержки из стандарта в сочетании с этим правилом? или я пропустил этот клей? : интерпретация и атрибуты набора идентификаторов. Определение идентификатор - это объявление для этого определить, что: - для объекта вызывает хранилище, которое будет зарезервировано для этого объект; - для функции включает тело функции; - для перечисления имя константы или typedef, это (только) объявление идентификатора.

Как обсуждалось в 5.1.1.1, единица измерения текст программы после предварительной обработки представляет собой единица перевода, которая состоит из последовательность внешних объявлений. Они описаны как «внешние». потому что они появляются вне какой-либо функции (и, следовательно, имеют файловую область видимости). Как обсуждается в 6.7, декларация, которая также приводит к резервированию хранилища для объект или функция, названные идентификатор - это определение.

Внешнее определение - это внешнее объявление, которое также является определением функции (кроме встроенной определение) или объект. Если идентификатор объявлен с внешним связь используется в выражении (кроме как части операнда оператор sizeof, результатом которого является целочисленная константа), где-то в вся программа должна быть ровно одно внешнее определение для идентификатор; в противном случае должно быть не более одного.

Спасибо.

22
задан CharlesB 16 June 2011 в 11:52
поделиться