Les fonctions doivent-elles être rendues «externes» dans les fichiers d’en-tête?

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

Par exemple, devrais-je écrire ceci:

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

ou ca:

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

Du 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 scope du fichier, le lien résultant est le même que celui de la déclaration visible;
  • sinon, le résultat est un lien externe.

Donc, si c’est la seule fois où elle est déclarée dans l’unité de traduction, elle aura un lien externe.

Les fonctions déclarées dans les en-têtes sont normalement (sauf si vous travaillez très dur) extern . Personnellement, je préfère voir le mot clé explicite ici – 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 que le rappel aide.

Avec les variables, il est important d’utiliser le mot-clé extern (et pas d’initialisation) dans le fichier d’en-tête. Par conséquent, pour la symésortinge avec les (très peu) variables globales déclarées dans les en-têtes, j’utilise aussi extern avec la fonction – bien que ce ne soit ssortingctement pas nécessaire.

Ils sont implicitement déclarés avec “extern”.

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

Cependant, les variables définies dans un en-tête .h , puis #included dans plusieurs fichiers .c , devront être déclarées extern .

Je ne me soucie jamais de “extern” dans mon code source, mais certaines personnes le font. À mon avis, avoir extern avant les variables mais pas les fonctions permet de voir plus clairement quelles choses sont des fonctions et quelles choses sont des variables (y compris éventuellement des pointeurs de fonction). Je pense que beaucoup dépend probablement de la manière dont les déclarations dans le fichier .h sont créées et de la manière dont elles se rapportent au fichier .c principal. Je commence généralement par taper dans les prototypes du fichier .h, puis copier / coller dans le fichier .c et append le corps de la fonction (en marquant le point-virgule à la fin du prototype), il faut donc append “extern” à le fichier d’en-tête ou extrait du fichier .c principal après le copier / coller.