Подтвердить что ты не робот

Undefined Объявление структуры C struct

У меня есть файл заголовка 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;
}

Большое спасибо за любые предложения,

4b9b3361

Ответ 1

К сожалению, компилятор должен знать размер port_t (в байтах) при компиляции main.c, поэтому вам нужно полное определение типа в файле заголовка.

Ответ 2

Если вы хотите скрыть внутренние данные структуры port_t, вы можете использовать технику, например, как стандартная библиотека обрабатывает объекты FILE. Клиентский код имеет дело только с элементами FILE*, поэтому им не нужно (в самом деле, как правило, не может) иметь какие-либо знания о том, что на самом деле находится в структуре FILE. Недостатком этого метода является то, что клиентский код не может просто объявить переменную такого типа - у них могут быть только указатели на нее, поэтому объект должен быть создан и уничтожен с использованием некоторого API, а все использования объекта должны быть через некоторый API.

Преимущество этого заключается в том, что у вас есть чистый чистый интерфейс к тому, как должны использоваться объекты port_t, и позволяет сохранять личные вещи частными (для частных лиц необходимы функции getter/setter для доступа к ним).

Точно так же, как обрабатывать файлы ввода/вывода FILE в библиотеке C.

Ответ 3

Общее решение, которое я использую:

/* 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);

Ответ 4

Я бы порекомендовал по-другому:

/* 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;
}

Как правило, не полезно определять переменные в файле заголовка.