[C] fonction extern déclaré dans les .h

fonction extern déclaré dans les .h [C] - C++ - Programmation

Marsh Posté le 26-04-2002 à 21:17:35    

je n'arrive pas à comprendre l'utlité du mot clé extern dans les définitions de fonctions (contenu dans un point h)des progs C.
 
je sais que le mot clé extern sert au compilateur pour lui indiquer que l'attribut déclaré en extern est défini dans un autre fichier (je l'utilise en C++).
 
 
Mais pour les fonctions en C qu'elle soit déclarée en tant qu'extern ou pas, étant donné que l'on fait un include du .h cela revient au même. :??:
 
Si quelqu'un connaît la réponse... :jap:

Reply

Marsh Posté le 26-04-2002 à 21:17:35   

Reply

Marsh Posté le 26-04-2002 à 22:35:28    

Je ne comprends pas la question...
 
Si tu déclares une fonction que tu décris plus loin, tu ne mets pas de extern.
 
Mais si la fonction est contenue dans un autre fichier, que ce soit un autre module de ton programme ou une bibliothèque, elle est déclarée avec extern (donc un .h ne doit contenir que des extern).


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 26-04-2002 à 22:56:12    

En C, pour une fonction, extern signifie que la fonction a une scope global. Cela s'oppose a static qui precise que la fonction a un scope limité au fichier ou elle est declaree.
Par defaut, toute fonction est extern.
 
Donc  
extern mytype 1myproto(mytype2  myvar);
et  
mytype1 myproto(mytype2  myvar);
sont entierement equivalent et s'opposent a  
static mytype1 myproto(mytype2  myvar);
 
Dans la pratique, on ecrit parfois explicitement extern pour clairement indiquer dans un module que la fonction est definie dans un autre:
Un style que j'ai vu utilise dans des boites etait:
 
/******** extern protos *************/
extern int f1();
.........
extern int fk();
 
/******** public protos **************/
int g1();
.......
int gk();
 
/******** local protos ****************/
static int h1();
.......
static int hk();
 
 
On regroupe avec cette technique les protos de  
fonctions globales declarées ailleurs et utilisees dans le fichier.
fonctions globales definies dans le fichier;
fonctions locales definies dans le fichier.
 
Je recommande pas cette technique:
Une technique superieure est:
* regrouper les globales definies dans le fichier dans un header (fichier.h)
* inclure les headers de ce types pour les fonctions publiques utilisees par le fichier
* garder la partie statique en tete de son fichier.
Ce genre de chose peut s'automatiser assez facilement.
 
J'ai vu des variantes:  
* regrouper les globales definies dans les fichiers du repertoire et utilisees par du code d'autre repertoires dans un header (glob_dir.h)
* regrouper les globales definies dans les fichiers du repertoire et utilisees par du code d'autre fichiers du meme repertoire dans un header (loc_dir.h)
* inclure les headers glob_otherdir.h pour les fonctions publiques utilisees par le fichier.
* inclure le header loc_dir.h.
* garder la partie statique en tete de son fichier.
Ce genre de chose peut s'automatiser assez facilement.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 26-04-2002 à 23:44:25    

gilou a écrit a écrit :

En C, pour une fonction, extern signifie que la fonction a une scope global. Cela s'oppose a static qui precise que la fonction a un scope limité au fichier ou elle est declaree.
Par defaut, toute fonction est extern.
 
Donc  
extern mytype 1myproto(mytype2  myvar);
et  
mytype1 myproto(mytype2  myvar);
sont entierement equivalent et s'opposent a  
static mytype1 myproto(mytype2  myvar);
 
Dans la pratique, on ecrit parfois explicitement extern pour clairement indiquer dans un module que la fonction est definie dans un autre:
Un style que j'ai vu utilise dans des boites etait:
 
/******** extern protos *************/
extern int f1();
.........
extern int fk();
 
/******** public protos **************/
int g1();
.......
int gk();
 
/******** local protos ****************/
static int h1();
.......
static int hk();
 
 
On regroupe avec cette technique les protos de  
fonctions globales declarées ailleurs et utilisees dans le fichier.
fonctions globales definies dans le fichier;
fonctions locales definies dans le fichier.
 
Je recommande pas cette technique:
Une technique superieure est:
* regrouper les globales definies dans le fichier dans un header (fichier.h)
* inclure les headers de ce types pour les fonctions publiques utilisees par le fichier
* garder la partie statique en tete de son fichier.
Ce genre de chose peut s'automatiser assez facilement.
 
J'ai vu des variantes:  
* regrouper les globales definies dans les fichiers du repertoire et utilisees par du code d'autre repertoires dans un header (glob_dir.h)
* regrouper les globales definies dans les fichiers du repertoire et utilisees par du code d'autre fichiers du meme repertoire dans un header (loc_dir.h)
* inclure les headers glob_otherdir.h pour les fonctions publiques utilisees par le fichier.
* inclure le header loc_dir.h.
* garder la partie statique en tete de son fichier.
Ce genre de chose peut s'automatiser assez facilement.
 
A+,  




 
 
 :jap:  :jap: , voilà moi la méthode dont je parlé été 'loc_dir.h' .Le mot clé extern est donc implicite, avec ou sans c'est une question de goût   :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed