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

C Discussion :

déclaration de fonction implicite ou explicite


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Août 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 29
    Par défaut déclaration de fonction implicite ou explicite
    Bonjour,

    Je lis le bouquin "méthodologie de la programmation en c norme C99".

    L'auteur du livre dit que si l'on déclare une fonction avant la fonction main, c'est une déclaration implicite.

    Et inversement si l'on déclare une fonction après la fonction main, c'est une déclaration explicite.

    cependant en lisant quelques pages plus loin, il montre un exemple ou il déclare une fonction après la fonction main, et parle de déclaration implicite.

    Qui pourrait bien m'expliquer cette notion de déclaration implicite ou explicite ?

    En vous remerciant par avance.

  2. #2
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    En fait la déclaration implicite (telle que je l'ai compris), c'est quand tu donne le corps de ta fonction en même temps.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    int carre( int n )
    {
         return n * n;
    }
     
    int carre2( int n );
     
    int main( void )
    {
    ...
    }
     
    int carre2( int n )
    {
         return n * n;
    }
    Ici, carre() est déclarée implicitement puisque tu ne donnes pas la signature de la fonction avant de donner son corps (ie: tu fais les deux en même temps).

    La fonction carre2 est déclarée explicitement (tu donnes sa signature) et ensuite définie après le main.

  3. #3
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    Personellement, g une autre notion a expliquer, ce que la declaration d'une fonction avnt la fonction main, sera connu avant l'appelle, mais la definition d'une fonction aprés le main, elle ne sera connu par main que a la fin du la compilation.....


    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void lireChaine()
    {
       .....
    }
     
    int main()
    {
       .....
       lireChaine();
       .....
       return 0;
     
    }
    pendant la compilation de la function main, le compilateur cannais la fonction 'lireChaine' alors c'est une declaration explicite....

  4. #4
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    En fait j'ai du mal m'exprimer. Lorsque tu définis ta fonction (ie: tu donnes son corps), ça déclare la fonction en même temps. Dans une déclaration explicite, tu déclares ta fonction puis tu la définis où tu veux.

    Personellement, g une autre notion a expliquer, ce que la declaration d'une fonction avnt la fonction main, sera connu avant l'appelle, mais la definition d'une fonction aprés le main, elle ne sera connu par main que a la fin du la compilation.....
    Pour moi la déclaration implicite ou explicite, ça n'est pas un problème d'être avant ou après la fonction main, tu peux très bien avoir une déclaration implicite après la fonction main (la fonction sera inutilisable on est bien d'accord).

    En fait, la déclaration implicite prend plus de sens dans la compilation séparée. (ie: avec les modules), où là elle est fortement déconseillée voire même impossible (car il y aurait redondance de code).

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Attention, le terme "déclaration implicite" employé par le compilateur gcc est différent de celui semble expliqué ici et mentionné dans le livre.
    • Le terme expliqué ici:
      • Si une fonction est définie sans être déclarée séparément, c'est une déclaration implicite.
      • Si la fonction est juste déclarée, et définie plus bas/autre part, c'est une déclaration explicite.
    • Le terme selon le compilateur gcc:
      • Si une fonction est définie ou déclarée avant toute utilisation, c'est une déclaration explicite.
      • Si une fonction est utilisée sans être déclarée ni définie plus haut, c'est une déclaration, implicite, avec des paramètres qui sont implicitement du type [FAUX]exact[/FAUX] qu'on a passé (promu), et un type de retour qui est implicitement int. Déconseillé en C, interdit en C++ (edit: Et en C99).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre averti
    Inscrit en
    Août 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 29
    Par défaut
    Bonjour,

    tout d'abord merci a tous les 2 de m'avoir repondu.

    donc si je vous resume si je declare une fonction avec sa definition c'est une declaration implicite ?

    et si je declare une fonction sans sa definition c'est une declaration explicite ?

    Merci pour les precisions.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Selon le vocabulaire du livre, oui.
    Selon le vocabulaire du compilateur gcc (edit: et de la norme), c'est explicite dans les deux cas.

    Edit: D'après le post de Jean-Marc, cela signifie que ton livre utilise son propre vocabulaire au lieu de respecter celui de la norme.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Médinoc
    Attention, le terme "déclaration implicite" employé par le compilateur gcc est différent de celui semble expliqué ici et mentionné dans le livre.
    • Le terme expliqué ici:
      • Si une fonction est définie sans être déclarée séparément, c'est une déclaration implicite.
      • Si la fonction est juste déclarée, et définie plus bas/autre part, c'est une déclaration explicite.
    • Le terme selon le compilateur gcc:
      • Si une fonction est définie ou déclarée avant toute utilisation, c'est une déclaration explicite.
      • Si une fonction est utilisée sans être déclarée ni définie plus haut, c'est une déclaration, implicite, avec des paramètres qui sont implicitement du type exact qu'on a passé, et un type de retour qui est implicitement int. Déconseillé en C, interdit en C++.
    Notes:
    • gcc utilise la nomenclature de la norme;
    • avec une declaration implicite, les parametres sont promus d'abord plutot que d'etre du type exact (avec les memes promotions que dans le cas des appels a une fonction variadique -- qui ne peuvent pas etre utilisees valablement sans une declaration explicite).

  9. #9
    Membre averti
    Inscrit en
    Août 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 29
    Par défaut
    bonjour,

    je possede le livre "méthologie de la programmation en c norme c99" et aussi le livre "syntaxe et fondamentaux du langage c"

    je vais a la page 55 rubrique "fonction" de ce meme livre.

    voila ce qui marqué :" les declarations implicites de fonction ne sont plus permises en ANSI C99"

    je crois que c'est claire et net la.

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Là, c'est "implicite" selon la norme.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre averti
    Inscrit en
    Août 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 29
    Par défaut
    oui c'est implicite maintenant depuis la norme c99.

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nicoser
    Je lis le bouquin "méthodologie de la programmation en c norme C99".

    L'auteur du livre dit que si l'on déclare une fonction avant la fonction main, c'est une déclaration implicite.

    Et inversement si l'on déclare une fonction après la fonction main, c'est une déclaration explicite.
    C'est le Braquelaire ? Tu peux donner la page ou le chapitre, j'ai un doute là...
    cependant en lisant quelques pages plus loin, il montre un exemple ou il déclare une fonction après la fonction main, et parle de déclaration implicite.

    Qui pourrait bien m'expliquer cette notion de déclaration implicite ou explicite ?

    En vous remerciant par avance.
    Je ne sais pas ce qu'a réellement dit l'auteur, ni comment tu l'as interprété, mais voici ce qu'il en est :

    - Une fonction définie avant son utilisation est déclarée explicitement.
    - Une fonction définie après son utilisation est déclarée implicitement, sauf si une déclaration séparée est placée avant l'utilisation.

    De plus, j'ajoute que l'usage des déclarations simples est proscrit depuis 1989, date de l'invention des prototypes qu'il faut utiliser en replacement des déclarations simples.

  13. #13
    Membre averti
    Inscrit en
    Août 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 29
    Par défaut
    salut,

    je crois que je l'ai plutot interpreté comme ca. mais etant un debutant...

    encore merci a tous de vos explications.

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

Discussions similaires

  1. Déclaration de fonction dans le "main".
    Par Pragmateek dans le forum C++
    Réponses: 14
    Dernier message: 23/06/2006, 19h32
  2. déclaration de fonctions externes
    Par poukill dans le forum C++
    Réponses: 40
    Dernier message: 17/05/2006, 16h15
  3. Réponses: 4
    Dernier message: 11/05/2006, 15h34
  4. Réponses: 6
    Dernier message: 20/11/2005, 02h53
  5. [JS] Problème déclaration de fonction
    Par glloq8 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/09/2005, 10h22

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