pb typedef struct commun a plusieurs sources
J'ai un problème avec typedef, voici grosso modo la structure de mon petit projet
main.c
Citation:
#include "main.h"
... du code ....
main.h
Citation:
#ifndef _main
#define _main
typedef struct
{
Int32 ma_variable;
} ma_structure;
#endif
test.c
Citation:
#include "main.h"
#include "test.h"
void essai(ma_structure *ptr)
{
ptr->ma_variable = 0;
}
test.h
Citation:
#ifndef _test
#define _test
void essai(ma_structure *ptr);
#endif
Quand je compile j'ai une erreur dans test.h sur ma_structure qui n'est pas reconnu, si je déplace le prototype dans test.c, ça marche.
Si je recopie la definition de ma_structure dans test.h ça marche aussi.
Y a pas une solution pour avoir une seule déclaration de ma_structure et surtout laisser le prototype essai dans test.h car j'en aurais besoin dans d'autres sources ?
Merci d'avance
Re: pb typedef struct commun a plusieurs sources
Citation:
Envoyé par albedo
J'ai un problème avec typedef, voici grosso modo la structure de mon petit projet
main.c
Citation:
#include "main.h"
Je le sens mal. main.c contient en général main(), qui est le point d'entrée du programme. Il n'y a donc, en principe, rien à exporter...
Citation:
Citation:
... du code ....
main.h
Citation:
#ifndef _main
#define _main
typedef struct
{
Int32 ma_variable;
} ma_structure;
#endif
Et Int32, c'est défini où ? Un header doit être autonome. Il doit inclure tout ce qui lui est nécessaire (les 'guards' sont là pour faire la police).
Citation:
test.c
Citation:
#include "main.h"
#include "test.h"
void essai(ma_structure *ptr)
{
ptr->ma_variable = 0;
}
test.h
Citation:
#ifndef _test
#define _test
void essai(ma_structure *ptr);
#endif
Pareil ici. 'ma_structure' n'est pas défini. C'est ici qu'il faudrait inclure le header qui contient sa définition... En fait, la structure devrait être 'liée' (sur le plan conceptuel) au code qui sert à traiter les données qui vont avec. La définition de la structure devrait donc être dans le même fichier (ici, test.h) que celui qui déclare la fonction (ici essai()).
La répartition des informations dans les fichiers ne se fait pas au hasard, mais selon des regles de conception bien précises. Par exemple :
http://emmanuel-delahaye.developpez....ganiser_source
http://emmanuel-delahaye.developpez.....htm#organiser
Citation:
Quand je compile j'ai une erreur dans test.h sur ma_structure qui n'est pas reconnu, si je déplace le prototype dans test.c, ça marche.
Si je recopie la definition de ma_structure dans test.h ça marche aussi.
Y a pas une solution pour avoir une seule déclaration de ma_structure et surtout laisser le prototype essai dans test.h car j'en aurais besoin dans d'autres sources ?
Je conseille ceci :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
/* main.c */
#include <stdio.h>
#include "mon_obj.h"
int main (void)
{
mon_obj obj =
{0};
printf ("obj.mon_champ = %lu \n", (unsigned long) obj.mon_champ);
mon_obj_essai (&obj);
printf ("obj.mon_champ = %lu \n", (unsigned long) obj.mon_champ);
return 0;
} |
avec
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
#ifndef H_MON_OBJ
#define H_MON_OBJ
/* mon_obj.h */
typedef unsigned long Int32;
typedef struct
{
Int32 mon_champ;
}
mon_obj;
void mon_obj_essai (mon_obj * ptr);
#endif |
et
Code:
1 2 3 4 5 6 7 8 9
|
/* mon_obj.c */
#include "mon_obj.h"
void mon_obj_essai (mon_obj * ptr)
{
ptr->mon_champ = 123;
} |
Pour aller plus loin :
http://emmanuel-delahaye.developpez.com/tad.htm
à garder sous le coude, et à voir dans quelques temps. C'est peut être un peu tôt...
Re: pb typedef struct commun a plusieurs sources
Citation:
Envoyé par Emmanuel Delahaye
Pareil ici. 'ma_structure' n'est pas défini. C'est ici qu'il faudrait inclure le header qui contient sa définition...
Taratata. Elle est tout a fait definie, puisque main.h a ete inclus dans test.c avant test.h. D'accord, ce n'est pas tres pratique, mais c'est tout a fait correct. Cela ne devrait pas produire d'erreur.
J'ai d'ailleurs verifie avec main.h:
Code:
1 2 3 4 5 6 7 8 9 10
|
#ifndef H_MAIN
#define H_MAIN
typedef struct
{
int my_var;
} my_struct;
#endif |
puis test.h:
Code:
1 2 3 4 5 6 7
|
#ifndef H_TEST
#define H_TEST
void essai(my_struct *ptr);
#endif |
et test.c:
Code:
1 2 3 4 5 6 7 8
|
#include "main.h"
#include "test.h"
void essai(my_struct *ptr)
{
ptr->my_var = 0;
} |
et cela marche.
Evidemment (dans le passe, il etait meme conseille qu'aucun header n'inclut un autre header. Ce temps est revolu, heureusement).
Donc albedo, ton erreur doit etre sur le Int32 non defini.
Re: pb typedef struct commun a plusieurs sources
Citation:
Envoyé par DaZumba
Citation:
Envoyé par Emmanuel Delahaye
Pareil ici. 'ma_structure' n'est pas défini. C'est ici qu'il faudrait inclure le header qui contient sa définition...
Taratata. Elle est tout a fait definie, puisque main.h a ete inclus dans test.c avant test.h. D'accord, ce n'est pas tres pratique, mais c'est tout a fait correct. Cela ne devrait pas produire d'erreur.
Bien sûr que ça marche, mais c'est horrible. Il n'y a aucune raison de séparer la définition des structures et la déclarations des fonctions publiques de base (pour les fonctions internes, ou des fonctions applicatives de haiut niveau, c'est autre chose).
Une meilleure organisation résout tous ces problèmes d'un coup. C'est sur ce point que je voulais insister.
Citation:
Envoyé par Emmanuel Delahaye
Un header doit être autonome. Il doit inclure tout ce qui lui est nécessaire (les 'guards' sont là pour faire la police).
Re: pb typedef struct commun a plusieurs sources
Citation:
Envoyé par DaZumba
Albedo, ton erreur doit etre sur le Int32 non defini.
Non ce n'est pas le Int32, sous codewarrior une telle organisation ne passe pas, pourtant j'aurais aussi cru que celà fonctionnerai.
Je connais pas CW sur le bout des doigts mais l'important c'est que ça marche.
J'ai fait un .h avec tous mes typedef que j'inclus la ou ça va bien. Donc problème résolu :)