Если у меня есть файл source.c со структурой:
struct a {
int i;
struct b {
int j;
}
};
Как можно использовать эту структуру в другом файле (т.е. func.c
)?
Должен ли я создать новый файл заголовка, объявить там структуру и включить этот заголовок func.c
?
Или мне следует определить всю структуру в файле заголовка и включить ее в оба source.c
и func.c
? Как можно объявить структуру extern
в обоих файлах?
Я должен typedef
это сделать? Если да, то как?
struct b
, но тогда ваша структураa
объявляет тип, который не используется (вероятно, вам следует определить имя члена, возможноk
, после внутренней закрывающей скобки и перед точкой с запятойОтветы:
если эта структура будет использоваться другим файлом func.c, как это сделать?
Когда тип используется в файле (например, в файле func.c), он должен быть видимым. Худший способ сделать это - скопировать и вставить в каждый необходимый исходный файл.
Правильный способ - поместить его в файл заголовка и включать этот файл заголовка при необходимости.
мы должны открыть новый файл заголовка, объявить в нем структуру и включить этот заголовок в func.c?
Это решение мне нравится больше, потому что оно делает код очень модульным. Я бы закодировал вашу структуру как:
Я бы поместил функции, использующие эту структуру, в тот же заголовок (функции, которые «семантически» являются частью ее «интерфейса»).
И обычно я мог назвать файл после имени структуры и использовать это имя снова, чтобы выбрать определения, определяемые защитой заголовка.
Если вам нужно объявить функцию, используя указатель на структуру, вам не понадобится полное определение структуры. Простое предварительное объявление, например:
Хватит, и это снижает сцепление.
или можем ли мы определить общую структуру в заголовочном файле и включить ее в source.c и func.c?
Это другой способ, более простой, но менее модульный: некоторый код, которому для работы нужна только ваша структура, все равно должен включать все типы.
В C ++ это может привести к интересным осложнениям, но это не по теме (без тега C ++), поэтому я не буду вдаваться в подробности.
затем как объявить эту структуру как extern в обоих файлах. ?
Возможно, я не понимаю сути, но у Грега Хьюгилла есть очень хороший ответ в его сообщении. Как объявить структуру в заголовке, которая будет использоваться несколькими файлами в c? ,
тогда как это будет печатать?
Причина в том, что управление структурами C может быть проблемой: вы должны объявить ключевое слово struct везде, где оно используется:
В то время как typedef позволит вам написать его без ключевого слова struct.
Это важно , вы по- прежнему держать имя структуры. Письмо:
просто создаст анонимную структуру с определенным типом именем, и вы не сможете объявить ее вперед-назад. Поэтому придерживайтесь следующего формата:
Таким образом, вы сможете использовать MyStruct везде, где хотите избежать добавления ключевого слова struct, и по-прежнему использовать MyStructTag, когда typedef не работает (например, предварительное объявление)
Редактировать:
Исправлено неправильное предположение об объявлении структуры C99, как справедливо заметил Джонатан Леффлер .
Изменить 2018-06-01:
Крейг Барнс напоминает нам в своем комментарии, что вам не нужно хранить отдельные имена для имени struct "tag" и его имени "typedef", как я сделал выше для ясности.
Действительно, приведенный выше код можно было бы записать как:
IIRC, на самом деле это то, что C ++ делает со своим более простым объявлением структуры за кулисами, чтобы поддерживать его совместимость с C:
Возвращаясь к C, я видел оба использования (отдельные имена и одинаковые имена), и ни у одного из них нет недостатков, о которых я знаю, поэтому использование одного и того же имени упрощает чтение, если вы не используете отдельные «пространства имен» C для структур и других символов. ,
источник
struct
тега иtypedef
имени. C использует другое пространство имен дляstruct
тегов, поэтому вы можете использоватьMyStruct
оба.Для определения структуры, которая будет использоваться более чем в одном исходном файле, вы обязательно должны поместить его в файл заголовка. Затем включите этот файл заголовка в любой исходный файл, для которого нужна структура.
extern
Декларация не используется для определения структуры, но вместо этого используется для объявления переменных (то есть, некоторые значения данных с типом структуры , которые вы определили). Если вы хотите использовать одну и ту же переменную в более чем одном исходном файле, объявите ее какextern
в файле заголовка, например:Затем в одном исходном файле определите фактическую переменную:
Если вы забудете это сделать или случайно определите это в двух исходных файлах, компоновщик сообщит вам об этом.
источник
GLOBAL
какextern
или ничего в верхней части заголовка, а затем объявить переменные какGLOBAL struct a myAValue;
. Из большинства исходных файлов, вы устраиваете для#define GLOBAL extern
версии , которые будут использоваться ( объявление переменных) и точно с одного исходного файла он вызывает пустые определить для использования так являются переменными определены .ах:
Итак, теперь вам просто нужно включить ah в файлы, в которых вы хотите использовать эту структуру.
источник