Как уже отмечалось в других ответах, вы могли бы изменить struct_tag
на struct struct_tag
в прототипе.Другой способ заставить ваш код компилироваться - написать
typedef struct struct_tag struct_tag;
вместо существующего struct struct_tag;
(т.е. объединить typedef с прямым определением).Это тогда позволяет вам писать
int initialize_ports(struct_tag *port)
без ошибок компиляции.Однако это все еще не совсем то, что вы хотите, потому что вызывающая сторона не может ни выделить локальную переменную этого типа, ни malloc () - потому что они не знают размер.
Другие ответы предполагают, чтоВы должны открыть определение структуры.Как правило, это неправильный ответ - потому что он удаляет слой абстракции, который вы пытаетесь создать.Гораздо лучше иметь функции (в port.c
, то есть в библиотеке, которую знает о внутренних элементах), например:
struct_tag *create_port(...);
void free_port(struct_tag *port)
, т. Е. Для создания и освобождения структур - и действительнодля других операций (например, чтение из / запись в структуру).