Bonjour,
Voilà dans un ancien programe j'ai vu le code suivant dans la partie definition et déclaration des variables globales.
Code:extern void *malloc ();
et je me demande ce que ça veut dire
Merci
Version imprimable
Bonjour,
Voilà dans un ancien programe j'ai vu le code suivant dans la partie definition et déclaration des variables globales.
Code:extern void *malloc ();
et je me demande ce que ça veut dire
Merci
C'est une déclaration de fonction externe (ici, déclaration de malloc comme elle peut l'être dans un fichier stdlib.h). Attention: cette déclaration n'est toutefois pas un prototype. Il s'agit probablement de code ancien et on préfére aujourd'hui écrire cette déclaration sous forme de prototype (afin de permettre la vérification des types à la compilation):
extern signifie que cette fonction est implantée dans un module externe i.e. une bibliothèque. Ce mot clé est facultatif et la déclaration ci-dessus est équivalente à:Code:extern void * malloc(size_t);
ThierryCode:
1
2 void * malloc(size_t);
Salut,
J'espere que c'était pour une bonne raison, car si c'était juste pour avoir la fonction déclarée, il suffit d'inclure <stdlib.h>
Si c'était pour ça, tu peux renvoyer l'auteur de ce source à ses cours de C
Bonjour
En faite ce code provient d'un manuel sur lex et yacc de l'éditeur o'reilly, et oui y'a du vieux code :)
Mais ce que je comprends pas, si on déclare la fonction comme externe, celà veut dire que le compilo va chercher cette fonction dans les bibliothèque à sa disposition ?
si c'est le cas et si j'avais pas inclu cette déclaration ni stdlib.h alors le compilo me mettrait une erreur lors de l'utilisation de malloc ?
pourtant en compilant avec cette ligne gcc lex.yy.c -lfl et en ayant enlever la déclaration de malloc en tant que fonction externe et en ayant omis le stdlib.h le compilo compile sans générer d'erreur ni de warning. Comme celà se fait il ?
merci
Lorsqu'une fonction n'est pas déclarée, le compilo considère qu'elle renvoie un entier de type int, et ne fait aucune vérification sur le nombre et le type des argument. Un gcc bien réglé me renvoit un avertissement si certaines fonctions ne sont pas déclarées.
Si malloc() n'est pas déclarée et que les valeurs retournées par cette fonction ne sont pas castées, tu devrais avoir un message d'erreur à cause de la conversion implicite de int vers un type pointeur.
Thierry
Une declaration de fonction ne sert qu'a avertir le compilateur que telle fonction existe avec tels paramètres
Un warning normalementCitation:
si c'est le cas et si j'avais pas inclu cette déclaration ni stdlib.h alors le compilo me mettrait une erreur lors de l'utilisation de malloc ?
Surement parce que <stdlib.h> est inclus par un des autres headers inclus.Citation:
pourtant en compilant avec cette ligne gcc lex.yy.c -lfl et en ayant enlever la déclaration de malloc en tant que fonction externe et en ayant omis le stdlib.h le compilo compile sans générer d'erreur ni de warning. Comme celà se fait il ?
Dans nos projets, on a une sorte de bibliothque interne à notre boite dont le header mega-commun inclut <stdio.h>, <stdlib.h> et <string.h>, et on sait (car on l'a fixé) que dès qu'on inclus ce mega header on a forcement ces 3 headers d'inclus.