прямое объявление неопределенной структуры C
-
05-07-2019 - |
Вопрос
У меня есть заголовочный файл port.h, port.c и мой main.c
Я получаю следующую ошибку:'ports' использует неопределенную структуру 'port_t'
Я думал, что, поскольку я объявил структуру в своем файле .h и наличие фактической структуры в файле .c, все в порядке.
Мне нужно иметь прямое объявление, так как я хочу скрыть некоторые данные в моем файле port.c.
В моем порту.h У меня есть следующее:
/* port.h */
struct port_t;
порт.c:
/* port.c */
#include "port.h"
struct port_t
{
unsigned int port_id;
char name;
};
главный.c:
/* main.c */
#include <stdio.h>
#include "port.h"
int main(void)
{
struct port_t ports;
return 0;
}
Большое спасибо за любые предложения,
Решение
К сожалению, компилятору необходимо знать размер port_t
(в байтах) при компиляции main.c, поэтому вам нужно полное определение типа в заголовочном файле.
Другие советы
Если вы хотите скрыть внутренние данные port_t
структура вы можете использовать метод, подобный тому, как стандартная библиотека обрабатывает FILE
Объекты.Клиентский код имеет дело только с FILE*
элементы, поэтому им не нужно (на самом деле, тогда вообще не может) иметь никаких знаний о том, что на самом деле находится в FILE
структура.Недостатком этого метода является то, что клиентский код не может просто объявить переменную такого типа - у них могут быть только указатели на нее, поэтому объект необходимо создать и уничтожить с помощью некоторого API, и ВСЕ использование объекта должно осуществляться через какой-то API.
Преимущество этого заключается в том, что у вас есть приятный чистый интерфейс для того, как port_t
объекты должны использоваться и позволяют вам сохранять личные вещи закрытыми (непубличным вещам нужны функции получения / установки, чтобы клиент мог получить к ним доступ).
Точно так же, как файловый ввод-вывод обрабатывается в библиотеке C.
Распространенное решение, которое я использую:
/* port.h */
typedef struct port_t *port_p;
/* port.c */
#include "port.h"
struct port_t
{
unsigned int port_id;
char name;
};
Вы используете port_p в функциональных интерфейсах.Вам также нужно будет создать специальные оболочки malloc (и free) в port.h:
port_p portAlloc(/*perhaps some initialisation args */);
portFree(port_p);
Я бы порекомендовал другой способ:
/* port.h */
#ifndef _PORT_H
#define _PORT_H
typedef struct /* Define the struct in the header */
{
unsigned int port_id;
char name;
}port_t;
void store_port_t(port_t);/*Prototype*/
#endif
/* port.c */
#include "port.h"
static port_t my_hidden_port; /* Here you can hide whatever you want */
void store_port_t(port_t hide_this)
{
my_hidden_port = hide_this;
}
/* main.c */
#include <stdio.h>
#include "port.h"
int main(void)
{
struct port_t ports;
/* Hide the data with next function*/
store_port_t(ports);
return 0;
}
Как правило, определять переменные в заголовочном файле бесполезно.