Par rapport au
./12, j'ai trouvé un élément de réponse : des problèmes peuvent se poser si deux structures s'utilisent mutuellement. Exemple :
// fichier a.h
#include "b.h"
typedef struct
{
B *b;
}A;
// fichier b.h
#include "a.h"
typedef struct
{
A *a;
}B;
(je n'ai pas écrit les directives pour éviter l'inclusion multiple par souci de simplicité)
A la compilation un problème se posera parce que lorsque le fichier a.h sera parsé, il inclut le fichier b.h qui définira le type B mais qui ne pourra pas le faire parce que le type A ne sera pas encore défini.
Le problème peut se résoudre comme ceci :
// fichier a.h
#include "b.h"
struct s_a
{
struct s_b *b;
};
typedef struct s_a A;
// fichier b.h
struct s_a; // On n'inclut pas a.h
struct s_b
{
struct s_a *a;
};
typedef struct s_b B;
Et comme ça on résoud le problème

Cette solution n'aurait pas pu être appliquée si on avait directement définit le type A sans définir la structure s_a.
Je me trompe ?
J'avais pensé à un truc de ce genre (pas joli joli) :
// fichier b.h
struct foo;
typedef struct foo A;
typedef struct
{
A *a;
}B;
Mais évidemment ça ne fonctionne pas parce qu'après avoir parsé les fichier a.h et b.h on se retrouve avec deux définitions pour le type A qui sont différentes.
En tout cas, je dois maintenant réorganiser pas mal de mes fichiers sources maintenant :/