Объявление переменной и несоответствие определений - PullRequest
0 голосов
/ 06 февраля 2019

Я использую компилятор C89 (встроенные системы).

Я столкнулся с некоторым кодом C, где одна единица перевода определяет переменную как bool varName;, где bool - это typedef из * 1006.*.Другой блок перевода вперед объявляет переменную следующим образом: extern char varName;.

Это, очевидно, несоответствие типов и ошибка.У меня вопрос, какое именно правило это нарушает?Моя реакция коленного рефлекса состояла в том, что это нарушение ODR, но есть одно определение, поэтому я не уверен, что это нарушение ODR.

1 Ответ

0 голосов
/ 06 февраля 2019

6.2.7p2

Все объявления, которые ссылаются на один и тот же объект или функцию, должны иметь совместимый тип;в противном случае поведение не определено.

Стандарт C89 имеет тот же параграф.

Объявления, относящиеся к одному и тому же объекту, более подробно объясняются в параграфе о связи:

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

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

Совместимые типы по существу означают идентичные типы с некоторыми незначительными оговорками (например, extern int foo[]; совместим с extern int foo[3];).

...