Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Déclaration de structure sans définition

5 réponses
Avatar
Antoine Calando
Bonjour,

Une petite question un peu tordue, je me demande d'ailleurs si il est
possible de le faire en c :

J'ai une structure contenant un pointeur sur le même type de structure
(type liste chainée) :

struct MaStructure {
int titi;
struct MaStructure * next;
};

struct MaStructure ms;


Je voudrais cependant ne pas avoir à utiliser le mot clé "struct" à
chaque intanciation, j'utilise pour cela un typedef :

typedef struct MaStructure {
int titi;
struct MaStructure * next;
} MaStructure;

MaStructure ms;

J'ai encore le mot clé "struct" nécessaire dans la définition, mais plus
par la suite donc ce n'est pas trop gênant... y aurait il cependant
possibilité de l'éviter cette première fois?


Maintenant je souhaiterais déclarer cette structure _sans_ la définire
(j'ai plusieurs fichiers d'include, et je ne souhaite les inclure que
lorsque c'est strictement nécessaire, cad pas pour intanciations de pointeur);

Je peux faire un
struct MaStructure;
struct MaStructure *ms_ptr;

mais j'aimerais arriver à un :

MaStructure *ms_ptr;

Existe-t-il une déclaration permetant de le faire?




Antoine

5 réponses

Avatar
Marc Boyer
Antoine Calando wrote:
Je voudrais cependant ne pas avoir à utiliser le mot clé "struct" à
chaque intanciation, j'utilise pour cela un typedef :

typedef struct MaStructure {
int titi;
struct MaStructure * next;
} MaStructure;

J'ai encore le mot clé "struct" nécessaire dans la définition, mais plus
par la suite donc ce n'est pas trop gênant... y aurait il cependant
possibilité de l'éviter cette première fois?


Pas à ma connaissance.

Je peux faire un
struct MaStructure;
typedef struct MaStructure MaStructure;


MaStructure *ms_ptr;


Marc Boyer
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...

Avatar
Antoine Leca
En , Antoine Calando va escriure:
J'ai une structure contenant un pointeur sur le même type de structure
Je voudrais cependant ne pas avoir à utiliser le mot clé "struct" à
chaque intanciation, j'utilise pour cela un typedef :

typedef struct MaStructure {
int titi;
struct MaStructure * next;
} MaStructure;

MaStructure ms;

J'ai encore le mot clé "struct" nécessaire dans la définition, mais
plus par la suite donc ce n'est pas trop gênant... y aurait il
cependant possibilité de l'éviter cette première fois?


typedef struct MaStructure MaStructure;

struct MaStructure {
int titi;
MaStructure * next;
} ;

MaStructure ms;


Je ne sais pas ce que cela t'apportes (il faut dire que je garde
systématiquement struct, c'est en fait une question de style). Mais cela
répond à ta question, non ?

Maintenant, si tu veux supprimer l'un des deux struct, je pense qu'il te
faut te pencher sur C++...



Maintenant je souhaiterais déclarer cette structure _sans_ la définire


Aucun souci (sauf celui d'utiliser des compilateurs qui s'en plaignent): tu
peux placer la première de mes lignes dans un fichier d'entête, tant le
compilateur n'a pas besoin de connaître la taille de la structure ou sa
composition (en gros, tant que tu manipules les structures comme des objets
opaques, à travers des pointeurs), tu peux créer des pointeurs vers
MaStructure, les passer en arguments, leur assigner des résultats de
fonction, etc.

Antoine


Antoine

Avatar
Antoine Calando
On 7 May 2004 13:35:36 GMT, Marc Boyer wrote:

Je peux faire un
struct MaStructure;


typedef struct MaStructure MaStructure;



Le problème est qu'il y a une erreur à la compilation lorsqu'un
fichier inclus l'entête avec déclaration et celui avec definition :

In file included from prog.c:20:
inc_definition.h:91: redefinition of 'MaStrucutre'
inc_declaration.h:75: `MaStrucutre' previously declared here

(avec gcc 3.2.3 / linux)

Antoine


Avatar
Horst Kraemer
On Fri, 07 May 2004 15:20:26 +0200, Antoine Calando
wrote:


Je voudrais cependant ne pas avoir à utiliser le mot clé "struct" à
chaque intanciation, j'utilise pour cela un typedef :

typedef struct MaStructure {
int titi;
struct MaStructure * next;
} MaStructure;

MaStructure ms;

J'ai encore le mot clé "struct" nécessaire dans la définition, mais plus
par la suite donc ce n'est pas trop gênant... y aurait il cependant
possibilité de l'éviter cette première fois?


Je ne vois pas l'intérêt, mais bon:

typedef struct MaStructure MaStructure;

struct MaStructure {
int titi;
MaStructure * next;
};

MaStructure ms;


Maintenant je souhaiterais déclarer cette structure _sans_ la définire
(j'ai plusieurs fichiers d'include, et je ne souhaite les inclure que
lorsque c'est strictement nécessaire, cad pas pour intanciations de pointeur);

Je peux faire un
struct MaStructure;
struct MaStructure *ms_ptr;

mais j'aimerais arriver à un :

MaStructure *ms_ptr;


typedef struct Mastructure Mastructure;

--
Horst

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Antoine Calando
wrote:

Je peux faire un
struct MaStructure;
struct MaStructure *ms_ptr;

mais j'aimerais arriver à un :

MaStructure *ms_ptr;

Existe-t-il une déclaration permetant de le faire?


Oui. C'est la méthode utilisée pour faire des ADT :

/* declaration publique (interface) */
typedef struct obj obj_s;

/* declaration prive'e (implementation) */
struct obj
{
int yadayada;
};

Partout, on peut utiliser 'obj_s'.

- En instanciation, dans l'implémentation uniquement.
- En pointeur, partout.

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?libÉ9
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/