2010-10-06 19 views
8

Je travaille sur un code que je n'ai pas écrit et j'ai remarqué qu'il y en a beaucoup extern void my_func();.Pourquoi utiliser `extern void my_func();` plutôt que d'inclure `my_utils.h`?

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

Existe-t-il une raison pratique de déclarer une fonction comme extern plutôt que de la placer dans un fichier d'en-tête et de l'inclure? Ou est-ce juste un choix stylistique?

Répondre

9

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.

+0

Les fonctions sont toujours extern par défaut dans C? êtes-vous sûr?? – Donotalo

+0

@Donotalo: Assez sûr, mais il est minuit, alors qui sait ce que la fatigue a fait à mon cerveau. –

+0

Je travaille pour le micro-contrôleur depuis 2 ans. le compilateur que j'utilise est C. mais pas complètement ANSI C, et de nombreuses fonctionnalités de C99 sont absentes, mais pour appeler une fonction non-statique définie dans un autre fichier, nous devons externaliser son prototype, ou inclure l'en-tête. – Donotalo

-3

Une utilisation de extern fonctions est que supposons que vous avez deux modules: module_a (mis en œuvre dans module_a.h et module_a.c fichiers), module_b (mis en œuvre dans module_b.h et module_b.c fichiers). Vous voulez maintenant utiliser une fonction spécifique de module_b dans module_a. Mais vous ne voulez pas exposer toutes les fonctionnalités de module_b dans module_a. Donc, au lieu de #include "module_b.h", vous pouvez extern le prototype de fonction requis uniquement.

+0

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

+0

@Oli: Je viens de tester cette fonctionnalité en utilisant VS2008. Cela n'a pas fonctionné sauf 'extern'. Une idée pourquoi? J'ai 3 fichiers: main.cpp (contient main()), functions.h et functions.cpp. functions.cpp définit une fonction (nommée fun()) qui retourne simplement 0. à partir de main(), j'ai appelé 'cout << fun() << endl;' le compilateur dit que fun() est non déclaré. alors j'ai écrit 'extern int fun();' avant main(). alors ça a marché. – Donotalo

+0

Il fonctionnera aussi simplement avec 'int fun();'. –

-3

N'est-ce pas suffisant de déclarer prototype dans votre fichier * .c avant l'utilisation de la fonction, au lieu d'inclure le fichier d'en-tête entier? Inutile d'utiliser extern pour les fonctions. Je n'ai pas encore essayé mais ça suppose de fonctionner de cette façon.