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,

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top