Il faut d'abord distinguer entre déclaration et définition. Une déclaration introduit un nom et ne fait que préciser au compilateur l'usage de ce nom. Par défaut, une déclaration est souvent aussi une définition. Pour un objet une définition correspond aussi à son allocation. Une déclaration d'un objet ne sera pas une définition si elle comprend le préfixe extern.
Exemples de déclarations:
extern int i; struct S; class T; extern const int c; typedef char C; int f();Exemples de définitions (+déclarations):
int i; extern const c=1; struct S{int a; char c;}; enum{un,deux};
En C++, un objet doit être dans la portée d'une seule définition, mais
éventuellement de plusieurs déclarations.
En C++, pour permettre les compilations séparées, tout nom utilisé dans un
programme doit être dans la portée d'une déclaration présente dans le fichier.
Il n'y a pas, contrairement au C, de déclaration par défaut pour les fonctions.
En clair, le compilateur doit être capable de déterminer tous les types des
objets manipulés uniquement à partir de ce qui est présent dans le fichier à
compiler. Pour pouvoir utiliser une classe et les fonctions travaillant sur
cette classe, il faudra ajouter au fichier toutes les déclarations nécessaires
(fichiers d'inclusion).