2016-12-29 2 views
5

En C++, déclarer une variable plusieurs fois affiche une erreur lors de la compilation. Par exemple:Déclaration de fonctions et de variables plusieurs fois en C++

int x; 
int x; 

La déclaration d'une fonction plusieurs fois ne montre aucune erreur lors de la compilation. Par exemple:

int add(int, int); 
int add(int, int); 

Pourquoi cette distinction existe-t-elle en C++?

+0

La fonction peut être surchargée mais le nombre et les types de paramètres doivent être différents. Les variables ne peuvent pas être surchargées. – nischalinn

+0

Il ne surcharge pas son juste redéclarant. déclaration peut être faite à tout moment. – user1438832

+0

ce n'est pas une déclaration de fonction, c'est une déclaration de prototype, qui peut être faite plusieurs fois. C'est une distinction puisque C en fait. Prototype est une déclaration sans corps, déclaration ET corps considéré comme une définition, qui peut apparaître une seule fois. – Swift

Répondre

12

Notez que int x; n'est pas (seulement) declaration, c'est definition. Une erreur est apparue puisque ODR est violée, c'est-à-dire qu'une seule définition est permise dans une unité de traduction.

Une déclaration de variable peut être écrite comme:

// a declaration with an extern storage class specifier and without an initializer 
extern int x; 
extern int x; 

En attendant int add(int, int); est une déclaration (de fonction) exactement. Plusieurs déclarations dans une unité de traduction sont correctes, ODR n'est pas violé.

+1

Vous pouvez continuer et expliquer que la déclaration int int (int int) n'est pas une définition, donc ODR ne s'applique pas. – Peter

+0

Merci pour l'explication! Cela répond à mes doutes. :) –

+0

Il est important de noter que la déclaration directe des fonctions dans les en-têtes est extrêmement importante pour la gestion des dépendances (en disant essentiellement "vous pouvez supposer qu'au moment du lien, il devrait y avoir une fonction avec cette signature"). Cette déclaration directe peut facilement conduire à des doublons si des en-têtes différents avec la même déclaration sont inclus. Cependant, la définition en double de variables signifie 2 instances différentes de quelque chose avec le même nom, et aucun moyen de les désambiguïser. (Par conséquent, ce n'est pas autorisé.) –