Ответ 1
К сожалению, компилятор должен знать размер port_t
(в байтах) при компиляции main.c, поэтому вам нужно полное определение типа в файле заголовка.
У меня есть файл заголовка port.h, port.c и my main.c
Я получаю следующую ошибку: "ports" использует undefined struct 'port_t'
Я думал, что я объявил структуру в моем файле .h, и фактическая структура в файле .c была в порядке.
Мне нужно иметь переднее объявление, поскольку я хочу скрыть некоторые данные в файле port.c.
В моем port.h у меня есть следующее:
/* port.h */
struct port_t;
port.c:
/* port.c */
#include "port.h"
struct port_t
{
unsigned int port_id;
char name;
};
main.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
, и позволяет сохранять личные вещи частными (для частных лиц необходимы функции getter/setter для доступа к ним).
Точно так же, как обрабатывать файлы ввода/вывода FILE в библиотеке 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 (и бесплатные) обертки в 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;
}
Как правило, не полезно определять переменные в файле заголовка.