C Typedef – Type incomplet

Ainsi, le compilateur décide à l’improviste de dire ceci: “le client de terrain a un type incomplet“.

Voici les extraits de code pertinents:

client.c

#include  #include  #include "customer.h" struct CustomerStruct; typedef struct CustomerStruct { char id[8]; char name[30]; char surname[30]; char address[100]; } Customer ; /* Functions that deal with this struct here */ 

client.h

Un fichier d’en-tête pour customer.h

 #include  #include  #ifndef CUSTOMER_H #define CUSTOMER_H typedef struct CustomerStruct Customer; /* Function prototypes here */ #endif 

C’est là que mon problème est:

customer_list.c

 #include  #include  #include "customer.h" #include "customer_list.h" #include "..\utils\utils.h" struct CustomerNodeStruct; typedef struct CustomerNodeStruct { Customer customer; /* Error Here*/ struct CustomerNodeStruct *next; }CustomerNode; struct CustomerListStruct; typedef struct CustomerListStruct { CustomerNode *first; CustomerNode *last; }CustomerList; /* Functions that deal with the CustomerList struct here */ 

Ce fichier source a un fichier d’en-tête, customer_list.h, mais je ne pense pas que ce soit pertinent.

Mon problème

Dans customer_list.c, à la ligne avec le commentaire /* Error Here */ , le compilateur se plaint du field customer has incomplete type.

J’ai cherché ce problème toute la journée sur Google, et je suis maintenant sur le sharepoint retirer mes yeux et de les mélanger avec des fraises.

Quelle est la source de cette erreur?

Merci d’avance 🙂

[PS si j’ai oublié de mentionner quelque chose, faites le moi savoir. Sa journée a été stressante pour moi, comme tu pourrais le dire]

Déplacez la déclaration de structure dans l’en-tête:

 customer.h typedef struct CustomerStruct { ... } 

En C, le compilateur doit pouvoir déterminer la taille de tout object référencé directement. Le seul moyen de calculer la sizeof(CustomerNode) est que la définition de Client soit disponible pour le compilateur lors de la construction de customer_list.c .

La solution consiste à déplacer la définition de la structure de customer.c à customer.h .

Ce que vous avez est une déclaration avancée de la structure Customer que vous essayez d’instancier. Ce n’est pas vraiment permis car le compilateur n’a aucune idée de la structure, à moins de le voir définir. Donc, ce que vous devez faire est de déplacer votre définition du fichier source dans un en-tête.

Il semble que quelque chose comme

 typedef struct foo bar; 

ne fonctionnera pas sans la définition dans l’en-tête. Mais quelque chose comme

 typedef struct foo *baz; 

fonctionnera tant que vous n’avez pas besoin d’utiliser baz->xxx dans l’en-tête.