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

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

file1.c

typedef struct
{
    unsigned int unVar;             

} abc;

file2.c

typedef struct
{
    int var;
} abc;

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

6 ответов

Решение

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

  1. Присутствие списка описаний структуры в спецификаторе структуры или объединения объявляет новый тип в модуле перевода.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Есть ли в C одно правило определения, подобное C++?

Другие вопросы по тегам