Problème d'inclusions imbriquées [C] - C - Programmation
Marsh Posté le 14-08-2006 à 08:10:51
finalement je m'en suis sorti en remplaçant:
Code :
|
par
Code :
|
Si j'ai bien compris, c'est une définition incomplete de la structure, pour pouvoir utiliser un pointeur sur celle-ci sans devoir en donner la définition complète (ce qui permet d'éviter le #include "scene.h" ).
Maintenant, est-ce qu'il existe un moyen pour que le prototype
Code :
|
devienne
Code :
|
?
Marsh Posté le 14-08-2006 à 12:46:31
oui
sinon j'aimerai bien arriver à ça:
Code :
|
mais c'est quoi la bonne syntaxe?
Marsh Posté le 14-08-2006 à 13:08:19
avec un typedef ?
struct Scene;
typedef struct Scene Scene;
pour l'histoire des includes, imagine qu'au final tout dois etre dans un seul fichier, donc tu ne peux pas inclure l'un avant l'autre et vice-versa, ca n'a pas de sens et en plus tu mets des 'includes gardes' donc ca veut dire que tu ne comprend pas ce que tu ecris
Marsh Posté le 14-08-2006 à 13:42:56
si justement, les "includes gardés" protègent contre les multiples inclusions, ce qui permet d'inclure un header dès qu'on veut manipuler les types qu'il définit (ce que je fais toujours, pour des raisons de lisibilités). Un code lisible est plus maintenable, si tu met tout dans un seul fichier tu sera le seul (et encore) à pouvoir faire évoluer ton code...
struct Scene;
typedef struct Scene Scene;
ok mais je voulais justement éviter de définir Scene en dehors du header qui lui est dédié
Marsh Posté le 14-08-2006 à 14:48:43
b4u a écrit : si justement, les "includes gardés" protègent contre les multiples inclusions, ce qui permet d'inclure un header dès qu'on veut manipuler les types qu'il définit (ce que je fais toujours, pour des raisons de lisibilités). |
je parlais pas de ca, si tu mets des includes gardes dans 2 fichiers qui s'inclusent mutuellement, il y a comme un probleme de comprehension sur la precompilation
Citation : Un code lisible est plus maintenable, si tu met tout dans un seul fichier tu sera le seul (et encore) à pouvoir faire évoluer ton code... |
quand j'ai dit de tout mettre dans un seul fichier ? j'ai dit qu'apres la precompilation un seul le contenu du .c et des .h inclus se retrouve dans un seul fichier qui correspond au flux textuel de l'unité de traduction, si tu raisonne comme ca tu peux comprendre pourquoi ca n'a aucun sens que 2 fichiers sinclusent mutuellement, avec les includes gardes l'un des 2 includes est ignoré et sans ca part dans un dévellopement d'include "infinie" (en fait limité à 256 je crois)
Citation : ok mais je voulais justement éviter de définir Scene en dehors du header qui lui est dédié |
dans ce cas de figure on peut tout mettre dans un meme en-tete
Marsh Posté le 14-08-2006 à 15:18:51
je vais reformuler le probleme pour éviter qu'on aie a jouer sur les mots:
quelle est la meilleure façon de structurer les fichiers d'en-tete pour éviter les problemes de compilation liés aux forward declarations, sans bousiller l'interface et la structure du code?
par interface je veux dire: définition d'un unique type de donnée et déclaration de son set de fonction associé, le tout clairement lisible, en un ou plusieurs fichiers .h formant un truc homogène?
Marsh Posté le 14-08-2006 à 16:24:20
tu peux faire comme ca pour scene.h
Code :
|
et dans Layout.h
Code :
|
il y a d'autre facons de faire, tu peux par exemple faire en sorte, toujours à l'aide de directives de precompilations,
que la premiere fois que scene.h est inclus ca ne genere que la forward déclaration
Marsh Posté le 14-08-2006 à 17:06:46
ok merci
ta solution me fait penser qu'en définissant 2 fichiers .h, un pour la définition du type Scene, l'autre pour le prototype des fonctions le manipulant (pareil pour le type Layout) m'éviterait la forward declaration
Marsh Posté le 20-08-2006 à 14:25:03
b4u a écrit : ok merci |
Ben si le type "Scene" (déjà, il serait bien que tu nommes tes types "t_qqchose" et tes structures "s_qqchose", cela te permettra, plus tard, de moins t'embrouiller avec des identifiants de type et des identifiants de variables) est associé au type "layout", alors un seul header pour les deux serait un plus...
Marsh Posté le 13-08-2006 à 23:37:54
Bonsoir,
j'ai deux headers (pour simplifier...) définis comme ça (je n'ai mis que les parties intéressantes):
et le deuxième, qui inclut le premier:
Mais ça ne compile pas, car les deux headers s'incluent l'un l'autre (j'ai déja vu la réponse quelquepart mais je n'arrive pas à remettre la main dessus)