8
votes

Pourquoi utiliseriez-vous `extern vide my_func ();` plutôt que comprenant `my_utils.h`?

Je travaille sur un code que je n'ai pas écrit et j'ai remarqué qu'il y avait beaucoup extern vide my_func (); . .

Ma compréhension est que extern pour les variables globales, pas pour les fonctions.

Y a-t-il une raison pratique de déclarer une fonction comme extern plutôt que de la mettre dans un fichier d'en-tête et y compris cela? Ou est-ce juste un choix stylistique?


0 commentaires

3 Réponses :


11
votes

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 est toujours inutile pour les fonctions, car les fonctions sont toujours extern par défaut.


7 commentaires

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 son prototype ou inclure la entête.


@Donotalo: Ensuite, votre compilateur est cassé. #include - -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 Fonctions!


Non, nous ne mettons pas externe 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 . J'avais tort.


@Donotalo une déclaration de fonction r func (t arg) indique au compilateur qu'il existe une fonction appelée Func qui renvoie une valeur de type r et A un paramètre formel de type t appelé arg . 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.



-3
votes

Une utilisation de externe Les fonctions sont supposées que vous avez deux modules: module_a (implémenté dans module_a.h et module_a.c fichiers) , module_b (implémenté dans module_b.h et module_b.c 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" vous pouvez extern le prototype de fonction requis uniquement.


2 commentaires

Comme indiqué dans les commentaires à ma réponse, l'utilisation de extern est inutile.


@Oli: Je viens de tester cette fonctionnalité à l'aide de VS2008. Cela n'a pas fonctionné sauf extern . 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; compilateur dit que Fun () est non-claché. Ensuite, j'ai écrit externe int amusé (); avant principal (). alors ça a fonctionné.



-3
votes

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.


0 commentaires