Дублирующее определение структуры (одно определение в заголовке и другое в источнике C) - PullRequest
1 голос
/ 22 июня 2010
  1. Объявлена ​​одна структура STRUCT_ABC в заголовочном файле abc.h
  2. Включен abc.h в abc.c файл и используется STRUCT_ABC в некоторых функциях внутри abc.c.
  3. Другой файл def.c не включает abc.h. Но в def.c я снова определил структуру с тем же именем, то есть STRUCT_ABC, но с другим содержанием.
  4. Оба abc.c & def.c находятся в одной библиотеке, и элемент управления впервые появляется в abc.c во время выполнения.
  5. Управление переходит от abc.c к def.c и возвращается, скажем, несколько раз.

Может ли это всегда выдавать ошибку во время выполнения или иногда это может работать?

Ответы [ 3 ]

0 голосов
/ 22 июня 2010

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

0 голосов
/ 22 июня 2010

Как и в других заявленных плакатах, если вы строго определяете структуры в обоих местах, у вас должно быть все в порядке.Тем не менее, вы напрашиваетесь на неприятности, особенно если в def.c когда-либо нужно включать abc.h.

Из вашего описания мне не на 100% ясно, является ли STRUCT_ABC структурным именем или экземпляромназвание.Если вы определяете экземпляры структур в обоих файлах (вне функции), и экземпляры имеют одинаковые имена, у вас возникнет проблема компиляции, если вы не объявите один или оба экземпляра static.

Ошибкидолжны быть ошибки компиляции, если только вы не обманываете функцию, ожидающую один STRUCT_ABC, с использованием другого (т.е. через указатель).

0 голосов
/ 22 июня 2010

Это, конечно, не приведет к ошибке во время выполнения.

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

На самом деле, если вы хотите использовать одну и ту же структуру в 2 местах, вам лучше определить ее в одном заголовке и #include использовать в нескольких .c файлах. Это облегчит обслуживание (вам нужно всего лишь обновить структуру), и вы точно будете знать, какое определение вы используете (поскольку оно только одно).

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