Définition d'un typedef de struct

Définition d'un typedef de struct

par Aybars Yazici,
Number of replies: 1
Les conventions nous impose que les definitions des types (typedef) précède les définitions des structures.

Or, pour pouvoir définir un type qui agit sur un struct (p.ex vector<struct>), il faut qu'un tel structure soit déjà déclaré. Le code suivant introduit une erreur à la compilation:

typedef vector<Image> Image_vector;
Struct Image {...} ;

Finalement, comment est-ce qu'on doit faire pour définir de tels types (et constantes globales de type struct)?
In reply to Aybars Yazici

Re: Définition d'un typedef de struct / notion de "forward declaration"

par Ronan Boulic,

Très bonne question.

1) Cet ordre provient d'une version des conventions destinée au langage C ; ça  demande à être mis à jour.

Mais tout d'abord j'illustre le cas du langage C pour comprendre d'où vient cet ordre. En C il faut construire explicitement avec typedef le nom de type associé à une structure. Cela peut se faire avant d'avoir défini le détail d'une structure.

Exemple en C :

typedef struct Image IMAGE;

struct Image{
  // ici les champs définissant cette structure
};

En C++ il existe quelque chose d'équivalent au typedef ci-dessus ; cela s'appelle faire une "forward declaration" simplement comme ceci:

struct Image ;

ensuite vous pouvez déclarer votre nouveau type avec typedef sans avoir à fournir le détail de de la structure Image:

typedef vector<Image> Image_vector;

// ensuite plus loin:
struct Image{
// détails de la struct
}

Indépendamment des conventions du cours, le concept de forward declaration est très général: il vous permet de contourner le problème que vous auriez si vous aviez deux structures qui dépendent l'une de l'autre. Dans un tel scénario impossible de définir vos structures sans erreur de compilation. La solution est de faire un forward declaration de vos type de structures, et ensuite vous pouvez déclarer le détail de vos structures sans souci.


je rajoute dans les conventions que, en plus de typedef, cette région doit aussi contenir les déclarations anticipées (forward declaration) .

2) Pour la déclaration d'une constante globale de type structure, cela n'est possible qu'après avoir donné les détails de la structure pour que le compilateur puisse vérifier cette déclaration avec initialisation.

Dans ce cas là, vous avez tout à fait raison, la convention doit être modifiée pour autoriser les déclaration de constantes globales avec constexpr, APRES la déclaration des détails d'une structure.


Conclusion: j'ai mis à jour les conventions de programmation (page 5) sur moodle. La nouvelle version est rétro-compatible ; le code qui respectait l'ancienne version est aussi cohérent avec la nouvelle version.

https://moodlearchive.epfl.ch/2018-2019/mod/resource/view.php?id=1000885