Je travaille sur un code que je n'ai pas écrit et j'ai remarqué qu'il y avait beaucoup Ma compréhension est que Y a-t-il une raison pratique de déclarer une fonction comme extern vide my_func (); code>. p>.
extern code> pour les variables globales, pas pour les fonctions. p>
extern code> plutôt que de la mettre dans un fichier d'en-tête et y compris cela? Ou est-ce juste un choix stylistique? P>
3 Réponses :
Ceci n'est nécessaire que si, pour une raison quelconque, le fichier d'en-tête ne déclare pas la fonction. Et extern code> est toujours inutile pour les fonctions, car les fonctions sont toujours
extern code> par défaut. P>
Les fonctions sont toujours externes par défaut dans C? es-tu sûr??
@Donotalo: Assez bien sûr, mais il est minuit, alors qui sait quelle fatigue a fait à mon cerveau.
Je travaille pour un micro contrôleur pendant 2 ans. Le compilateur que j'utilise est C. Bien que pas complètement ANSI C, et de nombreuses fonctionnalités de C99 sont absentes, mais d'appeler une fonction non statique définie dans un autre fichier, nous devons extern code> son prototype ou inclure la entête.
@Donotalo: Ensuite, votre compilateur est cassé. #include code> - -ing Un fichier d'en-tête avec des prototypes de fonction est équivalent à la rédaction des prototypes directement dans votre fichier source et que vous ne voyez pas les fichiers d'en-tête pleins de fonctions explicites
extern code> Fonctions!
Non, nous ne mettons pas externe code> fonction dans l'en-tête. Nous devons le mettre dans des fichiers .c où ils sont appelés.
Je l'ai eu que voulez-vous dire par: les fonctions sont toujours externes par défaut. Au début, je pensais que des fonctions peuvent être appelées sur des fichiers de mise en œuvre sans inclure l'en-tête et sans externe code>. J'avais tort.
@Donotalo une déclaration de fonction r func (t arg) code> indique au compilateur qu'il existe une fonction appelée
Func code> qui renvoie une valeur de type
r code> et A un paramètre formel de type
t code> appelé
arg code>. Cela permet d'utiliser le nom de la fonction dans le contexte de la Déclaration. La liaison est responsable de la résolution d'un tel nom et de trouver la définition de fonction correspondante qui pourrait être trouvée dans une unité de compilation différente.
Une utilisation de externe code> Les fonctions sont supposées que vous avez deux modules: module_a (implémenté dans
module_a.h code> et
module_a.c code> fichiers) , module_b (implémenté dans
module_b.h code> et
module_b.c code> fichiers). Maintenant, vous voulez une fonction spécifique du module_b à utiliser dans module_a. Mais vous ne voulez pas exposer à toutes les fonctionnalités du module_b dans le module_a. Donc, cette affaire au lieu de
#include "module_b.h" code> vous pouvez
extern code> le prototype de fonction requis uniquement. P>
Comme indiqué dans les commentaires à ma réponse, l'utilisation de extern code> est inutile.
@Oli: Je viens de tester cette fonctionnalité à l'aide de VS2008. Cela n'a pas fonctionné sauf extern code>. Une idée pourquoi? J'ai 3 fichiers: Main.CPP (contient principal ()), fonctions.h et fonctions.cpp. Fonctions.CPP Définit une fonction (nommée amusement ()) qui vient de retourner 0. de Main (), j'ai appelé
COUT << FUN () << endl; code> compilateur dit que Fun () est non-claché. Ensuite, j'ai écrit
externe int amusé (); code> avant principal (). alors ça a fonctionné.
N'est-il pas suffisant de déclarer des prototypes dans votre fichier * .C avant l'utilisation de la fonction, au lieu d'inclure le fichier d'en-tête entiers? Pas besoin d'utiliser externe dans aucun cas pour les fonctions. Je n'ai pas encore essayé mais cela suppose que cela fonctionne de cette façon. p>