(я говорю о C, но это также относится к шаблонам классов в C ++)
В заголовочный файл принято помещать все ДЕКЛАРАЦИИ, а не определения.Однако мы обычно помещаем определения структуры или шаблоны классов в заголовочный файл, даже не зная, почему мы можем.Это на самом деле не имеет смысла, потому что они также являются определениями - ПРАВИЛО ОДНОГО ОПРЕДЕЛЕНИЯ.(Да, определения структур и шаблоны классов не вызывают установки хранилища, но вы все равно получаете ошибку «переопределения», ниже которой подразумевается, что они являются определениями.)
EX) определение нескольких структур с одним и тем же тегом в одном и том же тегеВ файле есть ошибка переопределения, но определение нескольких структур с одним и тем же тегом в нескольких исходных файлах не приводит к ошибке (то же самое происходит и с классом).
Единственное, что имеет смысл, - это определения структуры и классшаблоны имеют внутреннюю связь (в отличие от внешней ссылки по умолчанию), но я не могу найти ссылки на нее в K & R или справочном руководстве.На самом деле, структуры даже не упоминаются в связи.
Я хочу знать точную ссылку, где стандарт ANSI указывает на этот феномен.(IMO, это довольно двусмысленная вещь, которую НЕОБХОДИМО упомянуть где-то в стандарте ANSI.)
EDIT Я НЕ спрашиваю, почему определения структуры можно поместить в заголовочный файл.
Я спрашиваю, почему помещение определения структуры в заголовочный файл не вызовет ошибку переопределения, как это происходит, когда мы помещаем определения переменных в заголовочный файл (и включаем его в несколько исходных файлов)
EX) test1.c: int a = 3;test2.c: int a = 4;Вызывает ошибку компиляции из-за переопределения.Однако
test1.c: struct test {int a};test2.c: struct test {int b};Не вызывает ошибки компиляции, и единственная причина, по которой я могу придумать, состоит в том, что определения структуры либо имеют внутреннюю связь, либо вообще не имеют связи.