“paramètre a incomplète de type” avertissement
J'ai ceci dans un fichier C:
struct T
{
int foo;
};
le fichier C a un include d'un h fichier avec ces lignes:
typedef struct T T;
void listInsertFirst(T data, int key, LinkedList* ListToInsertTo);
la fonction listInsertFirst
est celui que je reçois le message d'avertissement sur le. Comment puis-je résoudre ce problème?
- merci,et si je veux que le type de knonwn si quelqu'un comprend le h de fichier ?
- Une chose que vous devez être conscient, c'est que vous êtes en passant un
struct
en valeur ici. C'est presque certainement une mauvaise idée... - Aucune raison pourquoi vous êtes typedef-ing dans le fichier C plutôt que dans le fichier d'en-tête. Aussi, vous pouvez typedef struct directement par avoir quelque chose comme struct { T, int toto;} T;
- Ce paramètre est le compilateur de référence?
- Je ne suis vraiment pas sûr de ce qui est la bonne chose à faire lors de la mise en œuvre (n'importe quel dictionnaire comme) DS:si la personne qui a appelé la fonction d'insertion ne l'allocation de mémoire et de passer un pointeur,ou doit-il passer de l'objet et de la fonction insérer devrait faire l'allocation ?
- Mercado je ne suis pas sûr (il n'est pas dit), mais je pense que c'est le paramètre de type T
- Eh bien, si
struct T
est en fait défini quelque part, alors cela ne devrait pas être un problème. Est la définition destruct T
dans le fichier avant de vous avez défini le type detypedef struct T T;
ou est-il réellement dans un autre fichier? Ou est-il dans un en-tête que vous n'avez pas vraiment comprendre? - Mercado j'ai déplacé le decleration à l'en-tête et c'est ok maintenant 🙂 mais je ne suis toujours pas sûr de ce que j'ai écrit dans mon commentaire précédent à Gangâdhar.pensées ?
- Pour être honnête, je ne peux pas dire à coup sûr. Il n'y a pas suffisamment d'informations pour faire une bonne suggestion. Je ne sais pas comment vous avez mis en œuvre les choses. Même si, comme ça c'est un autre problème maintenant, vous devriez demander à ce sujet dans une nouvelle question (avec beaucoup plus d'informations à propos de vos types).
- struct { int toto; } T;" avec votre premier T ("struct {T,...") n'est requis que si la structure a besoin de se référer à lui-même, comme "typedef struct Noeud { struct Noeud *suivant; } Noeud;".
Vous devez vous connecter pour publier un commentaire.
Comme nous l'avons constaté dans les commentaires, le problème est que la définition du
struct T
eu lieu après la définition de laT
dans l'en-tête. Vous avez vraiment des choses en arrière ici. L'en-tête devrait être la définition de tous les types et prototypes de fonction et de votre C les fichiers doivent être de les utiliser.Ce que vous voulez faire à la place est de changer la signature de votre fonction d'insertion pour recevoir un pointeur de vos données et la taille des données. Ensuite, vous pouvez allouer de la mémoire pour les données et les copier et de le stocker. Vous n'avez pas besoin d'un type spécifique, il suffit de déclarer un
void *
.Ensuite, l'appelant aurait faire quelque chose comme ceci:
Lorsque vous incluez le fichier d'en-tête, le compilateur sait que
T
est une structure de taille inconnue et quelistInsertFirst
en veut un comme premier argument. Mais le compilateur ne peut pas organiser un appel àlistInsertFirst
car il ne sait pas combien d'octets de push sur la pile pour laT data
paramètre, la taille deT
n'est connue qu'à l'intérieur du fichier oùlistInsertFirst
est défini.La meilleure solution serait de changer
listInsertFirst
de prendre unT*
comme premier argument de sorte que votre fichier d'en-tête voudrais dire ceci:Ensuite, vous obtenez un pointeur opaque pour votre
T
type de données et, depuis, tous les pointeurs sont de la même taille (dans le monde moderne, au moins), le compilateur va savoir comment construire la pile lors de l'appel delistInsertFirst
.Vous êtes sûr que c'est le premier paramètre qui est le problème? Pour être sûr, essayez de changer le paramètre de type de
T
àint
temporairement. Plus que probablement, le troisième paramètre est en fait le problème.De nombreux compilateurs ne pointez pas le problème dans ces sortes de questions très bien.
Essayez de déplacer la définition de la structure au h du fichier, avant la définition de type.
struct T
dans l'en-tête, pas dans .fichier c;