IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèque standard C Discussion :

extern void *malloc ();


Sujet :

Bibliothèque standard C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut extern void *malloc ();
    Bonjour,

    Voilà dans un ancien programe j'ai vu le code suivant dans la partie definition et déclaration des variables globales.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern void *malloc ();

    et je me demande ce que ça veut dire

    Merci

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    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):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern void * malloc(size_t);
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void * malloc(size_t);
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    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

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    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

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    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
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  6. #6
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    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
    ok, je bosse sur une vieille distrib linux (mandrake 10.1) et un gcc ancien, ça doit être pour ça

    correction : voir post plus bas

  7. #7
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Citation Envoyé par exhortae Voir le message
    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 ?
    Une declaration de fonction ne sert qu'a avertir le compilateur que telle fonction existe avec tels paramètres

    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 ?
    Un warning normalement

    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 ?
    Surement parce que <stdlib.h> est inclus par un des autres headers inclus.
    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.

  8. #8
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par Gruik Voir le message
    Surement parce que <stdlib.h> est inclus par un des autres headers inclus.
    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.
    Oui après vérification le .c creer par lex contient bien stdlib.h

    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. error LNK2019: symbole externe non résolu "void __cdecl MaFonction
    Par lolo le belge dans le forum Visual C++
    Réponses: 3
    Dernier message: 30/10/2009, 11h38
  2. Réponses: 25
    Dernier message: 23/02/2008, 21h35
  3. Malloc sur void
    Par Davide dans le forum C
    Réponses: 10
    Dernier message: 25/11/2005, 22h24
  4. problème variable extern
    Par HeKaz dans le forum C
    Réponses: 14
    Dernier message: 08/01/2003, 01h44
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo