Vos définitions de fonction à la fois de déclarer une entité appelée foo
avec une liaison externe, et la norme dit qu'il ne doit pas être plus d'une définition d'une entité avec une liaison externe. La structure des types définis ne sont pas des entités avec une liaison externe, donc vous pouvez avoir plus d'une définition de l' struct foo
.
Si vous avez déclaré des objets avec une liaison externe en utilisant le même nom, puis que serait une erreur:
foo.c
struct foo {
int a;
};
struct foo obj;
bar.c
struct foo {
char a;
};
struct foo obj;
Maintenant, vous avez deux objets appelés obj
que les deux ont une liaison externe, qui n'est pas autorisé.
Il serait toujours mal, même si l'un des objets est déclaré seulement, ne sont pas définis:
foo.c
struct foo {
int a;
};
struct foo obj;
bar.c
struct foo {
char a;
};
extern struct foo obj;
Il n'est pas défini, parce que les deux déclarations d' obj
font référence au même objet, mais ils n'ont pas de types compatibles (parce qu' struct foo
est défini différemment dans chaque fichier).
C++ est similaire, mais des règles plus complexes, afin de tenir compte inline
fonctions et inline
variables, les modèles, et d'autres fonctionnalités C++. En C++, les exigences pertinentes sont connus sous le nom d'Une Définition de la Règle (ou ODR). Une différence notable est que le C++ n'autorise même pas les deux struct
définitions, même si elles ne sont jamais utilisées pour déclarer des objets avec une liaison externe ou autrement "partagé" entre les unités de traduction.