Подтвердить что ты не робот

Такая же структура названия с другим определением в C

Разрешено ли использовать одну и ту же структуру имен с разными определениями в двух разных файлах c в том же проекте. Например,

file1.c

typedef struct
{
    unsigned int unVar;             

} abc;

file2.c

typedef struct
{
    int var;
} abc;

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

4b9b3361

Ответ 1

6.7.2.1 Спецификации структуры и объединения

  1. Наличие struct-declaration-list в struct-or-union-specifier объявляет новый тип, в пределах единицы перевода.

Типы определяются только внутри единицы перевода, в этом случае .c файл.

Нет проблем с определением двух типов с тем же именем в двух разных единицах перевода.

Однако эти два типа несовместимы, если они не следуют правилам, описанным в 6.2.7., p1. Типы, которые вы определили, несовместимы.

Ответ 2

Это определение типа. Он является локальным для каждого файла .c, и нет причин для получения ошибки. Определения должны быть сделаны в файлах заголовков, и тогда у вас не будет такой проблемы.

Ответ 3

Имена символов (переменные, функции) должны быть уникальными в пределах единицы перевода.

Единица перевода является базовой единицей компиляции для C и С++. Он состоит из исходного файла вместе со всеми включенными файлами (прямо или косвенно).

В вашем случае у вас есть два независимых исходных файла, каждый из которых определяет структуру; но они "не могут видеть" друг друга, поскольку они находятся в пределах отдельных единиц перевода.

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

Ответ 4

Это правильное использование для определения двух структур с одним и тем же именем в двух разных файлах *.c, поскольку они действительны только для текущей области в *.c, где она определена.

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

Ответ 5

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

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

Согласованность глобального типа не выполняется языком C, а С++ - в некоторой степени, это ответственность программистов. Правила кодирования - это рекомендации, которые помогут программистам избежать ошибок в этом недостатке.

Ответ 6

Вы ожидаете переопределенной ошибки (что произойдет с компилятором cpp), но это не произойдет в компиляторе C. Эта проблема возникает не только со структурой, но и с всеми видами переменных. Я задал вопрос для этого и получил некоторые подробные и качественные ответы.

Имеет ли C правило для одного определения, например С++?