web-dev-qa-db-fra.com

Les fonctions doivent-elles être rendues "externes" dans les fichiers d'en-tête?

Les fonctions doivent-elles être créées extern dans les fichiers d'en-tête? Ou sont-ils extern par défaut?

Par exemple, dois-je écrire ceci:

// birthdays.h
struct person find_birthday(const char* name);

ou ca:

// birthdays.h
extern struct person find_birthday(const char* name);
42
bodacydo

De Le Livre C :

Si une déclaration contient le spécificateur de classe de stockage externe ou est la déclaration d'une fonction sans spécificateur de classe de stockage (ou les deux), alors:

  • S'il existe déjà une déclaration visible de cet identifiant avec la portée du fichier, le lien résultant est le même que celui de la déclaration visible;
  • sinon, le résultat est une liaison externe.

Donc, si c'est la seule fois qu'il est déclaré dans l'unité de traduction, il aura un lien externe.

19
Matthew Flaschen

Ils sont implicitement déclarés avec "extern".

16
tur1ng

Les fonctions déclarées dans les en-têtes sont normalement (sauf si vous travaillez vraiment dur) extern. Personnellement, je préfère y voir le mot-clé explicite - mais le compilateur n'en a pas besoin. Cela rappelle aux lecteurs qu'ils sont extern, et comme les humains sont plus faillibles que les ordinateurs, je trouve le rappel utile.

Avec les variables, il est important d'utiliser le mot clé extern (et aucun initialiseur) dans le fichier d'en-tête. Par conséquent, pour la symétrie avec les (très peu) variables globales déclarées dans les en-têtes, j'utilise extern avec la fonction aussi - même si ce n'est strictement pas nécessaire.

14
Jonathan Leffler

Non, les fonctions déclarées dans les fichiers d'en-tête n'ont pas besoin d'être déclarées extern.

Mais les variables définies dans un .h en-tête puis #included en plusieurs .c fichiers devra être déclaré externe .

12
StuartLC

Je ne m'embête jamais avec "extern" dans mon code source, mais certaines personnes le font. À mon avis, le fait d'avoir des variables externes avant, mais pas des fonctions, rend plus évidentes visuellement quelles sont les fonctions et quelles sont les variables (y compris éventuellement les pointeurs de fonction). Je pense que beaucoup dépend probablement de la façon dont les déclarations dans le fichier .h sont créées et de leur relation avec le fichier .c principal. Je commence généralement par taper les prototypes du fichier .h, puis copier/coller dans le fichier .c et ajouter le corps de la fonction (en frappant le point-virgule à la fin du prototype), donc "extern" nécessiterait d'être ajouté à le fichier d'en-tête ou supprimé du fichier .c principal après le copier/coller.

2
supercat