Nous avons deux fichiers, foo.c et d'un bar.c.
Voici foo.c
#include <stdio.h>
volatile unsigned int stop_now = 0;
extern void bar_function(void);
int main(void)
{
while (1) {
bar_function();
stop_now = 1;
}
return 0;
}
Maintenant, ici, est bar.c
#include <stdio.h>
extern volatile unsigned int stop_now;
void bar_function(void)
{
while (! stop_now) {
printf("Hello, world!\n");
sleep(30);
}
}
Comme vous pouvez le voir, nous n'avons pas partagé-tête entre toto.c et d'un bar.c , cependant bar.c a besoin de quelque chose déclarée dans foo.c lors de son lié, et foo.c a besoin d'une fonction à partir de la barre.c lors de son lié.
En utilisant 'extern', vous dites au compilateur que tout ce qui suit, il sera trouvé (non statique) au moment de la liaison.
Il est très utile si vous avez besoin de partager certaines global entre les modules et ne veulent pas mettre / initialiser dans un en-tête.
Techniquement, chaque fonction dans une bibliothèque publique d'en-tête est "extern", cependant leur étiquetage en tant que telle a très peu ou pas de bénéfice, en fonction du compilateur. La plupart des compilateurs peuvent le faire sur leur propre. Comme vous le voyez, ces fonctions sont en fait définis ailleurs.
Dans l'exemple ci-dessus, le main() print " bonjour tout le monde qu'une seule fois, mais continuer à entrer bar_function(). A noter également, bar_function() ne va pas revenir dans cet exemple (puisque c'est juste un exemple simple). Imaginez stop_now être modifié lorsqu'un signal est desservi si cela ne semble pas assez pratiques.
Externes sont très utile pour des choses comme les gestionnaires de signaux, un mutex que vous ne voulez pas mettre dans un en-tête ou de la structure, etc. La plupart des compilateurs de l'optimiser pour s'assurer qu'ils n'ont pas de réserve de la mémoire pour les objets extérieurs, car ils savent qu'ils vont être de le réserver dans le module où l'objet est défini. Cependant, encore une fois, il y a peu de point de en précisant avec les compilateurs modernes lorsque le prototypage des fonctions publiques.
Espérons que cela aide :)