//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.