Question

J'ai un fichier d'en-tête port.h, port.c et mon main.c

J'obtiens l'erreur suivante: 'ports' utilise une structure non définie 'port_t'

Je pensais que j'avais déclaré la structure dans mon fichier .h et que la structure actuelle dans le fichier .c était ok.

Je dois disposer de la déclaration de retransmission car je souhaite masquer des données dans mon fichier port.c.

Dans mon port.h, j'ai les informations suivantes:

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

Merci beaucoup pour vos suggestions,

Était-ce utile?

La solution

Malheureusement, le compilateur a besoin de connaître la taille de port_t lors de la compilation de main.c, vous avez donc besoin de la définition de type complète dans le fichier d'en-tête.

Autres conseils

Si vous souhaitez masquer les données internes de la structure port_t , vous pouvez utiliser une technique telle que la manière dont la bibliothèque standard traite les objets FILE . Le code client ne traite que des éléments FILE * , de sorte qu'ils n'ont pas besoin (en fait, ne peuvent généralement pas) avoir la moindre connaissance de ce qui se trouve réellement dans la structure FILE . L’inconvénient de cette méthode est que le code client ne peut pas simplement déclarer une variable de ce type; ils ne peuvent avoir que des pointeurs sur celle-ci. L’objet doit donc être créé et détruit à l’aide d’une API, et all utilise un objet via une API.

L’avantage de ceci est que vous disposez d’une interface claire et claire sur la façon dont les objets port_t doivent être utilisés, et vous permet de garder les choses privées privées (les choses non privées ont besoin de fonctions de lecture / définition pour le client pour y accéder).

Tout comme la gestion des E / S FILE dans la bibliothèque C.

Une solution courante que j'utilise:

/* port.h */
typedef struct port_t *port_p;

/* port.c */
#include "port.h"
struct port_t
{
    unsigned int port_id;
    char name;
};

Vous utilisez le port_p dans les interfaces de fonction. Vous devrez également créer des wrappers malloc (et gratuits) spéciaux dans port.h:

port_p portAlloc(/*perhaps some initialisation args */);
portFree(port_p);

Je recommanderais une manière différente:

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

Il est généralement inutile de définir des variables dans un fichier d'en-tête.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top