declaração para a frente indefinido C struct
-
05-07-2019 - |
Pergunta
Eu tenho um arquivo de cabeçalho port.h, port.c, e meu main.c
Eu recebo o seguinte erro: usos 'portas' indefinido struct 'port_t'
Eu pensei como eu declarou o struct no meu arquivo .h e tendo a estrutura real no arquivo .c foi ok.
Eu preciso ter a declaração para a frente como eu quero esconder alguns dados no meu arquivo port.c.
Na minha port.h eu tenho a seguinte:
/* 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;
}
Muito obrigado por todas as sugestões,
Solução
Infelizmente, as necessidades do compilador para saber o tamanho do port_t
(em bytes) durante a compilação main.c, então você precisa a definição do tipo completo no cabeçalho do arquivo.
Outras dicas
Se você quer esconder os dados internos da estrutura port_t
você pode usar uma técnica como a forma como as alças da biblioteca padrão FILE
objetos. código de cliente só lida com itens FILE*
, então eles não precisam (na verdade, em seguida, geralmente não podem) ter qualquer knowlege do que é realmente na estrutura FILE
. A desvantagem deste método é que o código do cliente não pode simplesmente declarar uma variável para ser desse tipo - eles só podem ter ponteiros para isso, então as necessidades de objetos a serem criados e destruídos usando alguma API e todas usos do objeto tem que ser através de algum API.
A vantagem disso é que você tem uma interface limpa bom como deve ser utilizado objetos port_t
, e permite-lhe manter as coisas privadas privadas (coisas não privadas precisam de funções getter / setter para o cliente para acessá-los).
Assim como como ARQUIVO I / O é tratado na biblioteca C.
Uma solução comum que eu uso:
/* port.h */
typedef struct port_t *port_p;
/* port.c */
#include "port.h"
struct port_t
{
unsigned int port_id;
char name;
};
Você usa o port_p nas interfaces de função. Você vai precisar para criar malloc especial (e gratuito) invólucros em port.h assim:
port_p portAlloc(/*perhaps some initialisation args */);
portFree(port_p);
Eu recomendaria uma maneira diferente:
/* 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;
}
É geralmente não é bom para definir variáveis ??em um arquivo de cabeçalho.