Erreurs de redéfinition dans les fichiers .h

//list.h file typedef struct _lnode{ struct _lnode *next; size_t row; size_t column; short data; }lnode; typedef struct _llist{ struct _lnode *head; size_t size; }llist; //masortingx.h file typedef struct _masortingx{ size_t width; size_t height; size_t k; int **data; }masortingx; //smasortingx.h file #include "list.h" #include "masortingx.h" typedef struct _smasortingx{ size_t width; size_t height; size_t k; llist data; }smasortingx; smasortingx* make_smasortingx(masortingx *m); 

Le fichier smasortingx.h inclut les fichiers list.h et masortingx.h. Si j’inclus ces fichiers d’en-tête dans le fichier smasortingx.h, je reçois

  redefinition of 'lnode'. redefinition of '_llist' and redefinition of '_masortingx' errors. 

Si je prenais ces fichiers heder dans notre fichier smasortingx.h, l’erreur disparaissait mais il se plaignait du type de masortingce dans le paramètre function. Je souhaite appeler les fonctions définies dans les fichiers list.h et masortingx.h du fichier smasortingx.c .. Que dois-je faire? Merci d’avance..

Problème possible d’inclusions multiples.

Essayez de protéger vos fichiers d’en-tête avec

liste de fichiers.h

 #ifndef _LISTH_ #define _LISTH_  #endif 

fichier masortingx.h

 #ifndef _MATRIXH_ #define _MATRIXH_  #endif 

Cela vous évitera aussi d’avoir des redéfinitions si vous avez une boucle dans les inclusions d’en-tête.

vous devez inclure des gardes dans vos fichiers d’en-tête.

Eh bien, d’après votre code posté, ce qui me manque, c’est au début de chaque fichier * .h:

 #ifndef _some_unique_identifier_for_each_header #define _some_unique_identifier_for_each_header ...header contents #endif //_some_unique_identifier_for_each_header 

ou un

 #pragma once 

si votre compilateur le supporte.

Sans cela, si l’en-tête est inclus plusieurs fois à partir de sources différentes, des erreurs de redéfinition sont générées.

Vous avez probablement inclus smasortingx.h et list.h dans un autre fichier. Vous devriez éviter ça. La façon habituelle de faire est d’utiliser include guards .

Ce sont des macros que vous vérifiez avec #ifdef au début du fichier (avec #endif à la fin), et #define les #ifdef ... #endif dans le #ifdef ... #endif , vous assurant ainsi que même si vous incluez le même fichier Parfois, le compilateur ne le lira qu’une fois, à la première fois, et sautera tout le rest.