прямое объявление неопределенной структуры C

StackOverflow https://stackoverflow.com/questions/621356

  •  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;
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top