2010-11-30 8 views
1

En a.cpp:Pourquoi compile-t-on si "extern" est utilisé?

int t() 
{ 
    //definition goes here 
    ... 
} 

b.cpp:

#include "a.h" 

int main() 
{ 
    t(); 
} 

enfin a.h:

extern int t(); 
//int t(); 

Les deux formes d'œuvres a.h, pourquoi?

+0

Cela dépend de la ligne de commande que vous utilisez pour compiler, IIRC. – cdhowie

Répondre

9

Parce que les fonctions sont extern par défaut, le mot-clé extern est redondant. Certaines personnes aiment ajouter explicitement l'extern quand ils veulent suggérer à d'autres développeurs que la définition de la fonction ne peut pas être trouvée dans le fichier .cpp avec le même nom que ce fichier .h, puis ils ajoutent un commentaire pour pointer où la fonction est déclarée. Mais pour la perspective du compilateur, cela n'affecte rien.

+0

Qu'en est-il des variables? J'ai essayé 'int j;' et 'extern int j;' dans a.h, les deux fonctionnent toujours ... – wp2

+2

Les variables fonctionnent différemment, @ Wp2. Sans extern, vous aurez une nouvelle définition de 'j' dans chaque unité incluant * a.h *. Dans le code que vous avez montré, vous n'incluez ce fichier qu'une seule fois, dans * b.cpp *, mais si vous l'incluez ailleurs, vous aurez * plusieurs définitions * que C++ interdit, bien que les compilateurs ne soient pas obligés de se plaindre à ce sujet. –

+0

@ Wp2: Ce n'est pas portable C. Bien que C interdise strictement les multiples * définitions * d'une fonction/variable (une règle de définition), elle n'interdit pas qu'une variable/fonction soit * déclarée * plusieurs fois dans des fichiers différents. Certains compilateurs traitent 'int j;' seulement comme une * déclaration *, et déduisent s'il s'agit aussi d'une * définition *, insérant implicitement 'extern' dans toutes les déclarations/définitions, sauf une. Vous pouvez forcer le compilateur à le traiter comme une définition en tapant 'int j = 0;', ce qui oblige le compilateur à la fois * déclarer * et * définir * 'j'. Cela devrait échouer sur tous les compilateurs. –