bonjour a tous, dans le cours de language C, à cet endroit, je trouve celà :
typedef struct Coordonnees Coordonnees;
struct Coordonnees
{
int x;
int y;
};
je n'arrive pas à faire fonctionner ce code.
apprés quelque recherche, j'ai trouvé une autre maniére d'ecrire un tel typedef:
typedef struct
{
int x;
int y;
}Coordonees;
ce code faire exactement la méme chose et est plus condensé, même plus claire, mais je ne comprend pas pourquoi le cours explique une façon de faire plus longue qui ne fonctionne apparemment pas?
je trouve aussi bête de faire des typedef tout sa pour ne pas ecrire le mot struct... on perd en clarté dans le code non? mais bon... si tout le monde fait comme ça je devrai m'y habituer tempis
la façon de faire du cours est-elle censé fonctionner?
C'est en effet une mauvaise idée de coller des typedef à tout bout de champ.
C'est utile quand on veut, dans une bibliothèque, présenter une API où un type est relativement opaque, c'est à dire par exemple le programmeur d'application n'a pas besoin de savoir si les Événements qu'il manipule sont des structures, des unions ou des pointeurs parce qu'il les manipule à travers des fonctions.
C'est utile pour déclarer des types compliqués, comme "fonction qui prend un tableau et retourne une structure"
La principale différence que j'ai notée sur ces 2 syntaxes se trouve au niveau de l'IDE. Pour C::B au moins, la première syntaxe permet de retrouver le type par son nom dans la liste des typedef, sans quoi les structures sont simplement numérotées de manière incrémentale.
Question de goût donc choisis le style qui te plaît le plus. Pour ma part je préfère le typedef direct car ça peut s'appliquer avec les fonctions et les enum aussi ce qui rend le style assez homogène :
typedef enum Color {
red,
green,
blue
} Color;
typedef struct Point {
int x;
int y;
} Point;
typedef union Event {
ClickEvent click;
KeyEvent key;
};
typedef void (*OnClick)(const Event *);
- Edité par markand 16 septembre 2019 à 16:15:39
git is great because Linus did it, mercurial is better because he didn't.
bon et bien je viens de résoudre mon problème, il y avais en effet un problème tout autre. le fait de prendre de la distance sur son code fait souvent du bien :
il s'agissais simplement du fait que main.h ne faisais pas partit de mon projet selon mon IDE.. or, la structure se trouvais dans le main.h, inclu par un #include je suppose donc que le #include ne suffit pas pour que la compilation fonctionne correctement, l'ide doit aussi "connaitre" les fichier (code::block)
sujet donc résolu
- Edité par cobra7476 17 septembre 2019 à 19:25:17
typedef struct Coordonnees
{
int x;
int y;
} Coordonnees;
Dans le Kernighan et Ritchie, autre exemple, avec des noms différents
typedef struct tnode {
....
} Treenode;
Je trouve que ça contrevient au principe "évitez de multiplier les noms différents pour parler de la même chose" (*), mais d'un autre côté, est-ce vraiment la même chose ?
(*) Le K&R a bien des mérites, mais pas l'ambition d'être un manuel de bonne programmation :-)
(*) Le K&R a bien des mérites, mais pas l'ambition d'être un manuel de bonne programmation :-)
A l'époque de la première édition de "the C programming language", la commande
typedef struct Coordonnees
{
int x;
int y;
} Coordonnees;
était interdite (car justement on a deux objets différents qui portent le même nom.) D'où le code proposé par le K&R.
Je pense que c'est la sortie du C++ qui a amené le langage C à évoluer et à tolérer d'avoir un nom en double dans le même espace de noms. Ainsi on peut écrire une séquence à la fois valide en C et en C++.
(*) Le K&R a bien des mérites, mais pas l'ambition d'être un manuel de bonne programmation :-)
A l'époque de la première édition de "the C programming language", la commande
typedef struct Coordonnees
{
int x;
int y;
} Coordonnees;
était interdite (car justement on a deux objets différents qui portent le même nom.) D'où le code proposé par le K&R.
Je pense que c'est la sortie du C++ qui a amené le langage C à évoluer et à tolérer d'avoir un nom en double dans le même espace de noms. Ainsi on peut écrire une séquence à la fois valide en C et en C++.
Merci pour l'information sur l'évolution depuis le K&R C, ça m'avait échappé.
Je ne comprend pas ce que tu veux dire par "voir un nom en double dans le même espace de noms". L'évolution depuis K&R C a justement consisté à mettre les tags dans un namespace distinct des identificateurs de variables, fonctions, typedef et enum. Il n'y a pas de tolérance pour des noms en double dans le même namespace.
façon d'écrire un typedef de structure
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Bonhomme !! | Jeu de plateforme : Prototype.
git is great because Linus did it, mercurial is better because he didn't.
En recherche d'emploi.