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);
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.
Ils sont implicitement déclarés avec "extern".
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.
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 .
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.