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 :

[Curiosité] Pourquoi ne peut-on pas définir les fonctions inline dans un .ccp ?


Sujet :

C++

  1. #1
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut [Curiosité] Pourquoi ne peut-on pas définir les fonctions inline dans un .ccp ?
    Bonsoir.

    Je me demandais (suite à de nombreuses récriminations contre mon compilateur que la décence m'interdit de citer) pourquoi il est impossible de définir une fonction inline en dans un .ccp qui puisse être appelée d'un autre .ccp (je déteste mettre autre chose que des définitions dans les .h)...

    D'autre part, j'esperais savoir si le fait de mettre ces définitions dans un .h externe (du genre finline.h ) permettait de garder la propriété inline sans que l'éditeur de lien ne lâche une flopée d'injure dont la lecture abime la molette horizontale de ma souris... (et m'apprenne l'existence de nombre de charactères insoupsonés )

    En attendant vos réponses, je continue à faire des fonctions monoligne dans mes .h (gnark! les fonctions sont sur la même ligne que la définition).

    Merci

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Parce que tu inclus des fichiers .h et non des .cpp.
    Le compilateur doit connaitre le contenu d'une fonction inline pour le mettre directement dans le code appelant (sans appel de fonction donc, par définition).

    Mets toi à la place du compilateur, comment tu ferais pour généré du code assembleur dont tu ignorerais le code source?...

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 331
    Points : 36 851
    Points
    36 851
    Par défaut
    Le but d'une fonction "inline" c'est que le compilo va remplacer les appels à cette fonction par le corps de la fonction elle même.
    Lorsqu'on va effectuer l'edition de lien, la fonction n'existe plus.
    On peut donc inclure sa définition dans des .h sans que l'edition de lien ne rale.
    - W

  4. #4
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    On peut donc inclure sa définition dans des .h sans que l'edition de lien ne rale.
    - W
    C'est plutôt que l'on doit mettre sa définition dans un en-tête

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 331
    Points : 36 851
    Points
    36 851
    Par défaut
    Citation Envoyé par Alp Voir le message
    C'est plutôt que l'on doit mettre sa définition dans un en-tête
    Hello Alp,
    Ma description essaie de faire comprendre que, si nécessaire, une fonction inline peut être partagée en la définissant dans un .h
    Ta prescription laisse entendre que toutes les fonctions inline devraient être dans des .h, mais je suis sur que ce n'est pas ce que tu as voulu dire.
    -W

  6. #6
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Effectivement. Mais en la séparant, le compilo je crois risque de faire sauter l'inline.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 331
    Points : 36 851
    Points
    36 851
    Par défaut
    Citation Envoyé par Alp Voir le message
    Effectivement. Mais en la séparant, le compilo je crois risque de faire sauter l'inline.

    -W

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    (je déteste mettre autre chose que des définitions dans les .h).
    Tu confonds manifestement déclaration et définition.

    Voici la déclaration de la fonction f
    void f();
    Voici la définition de la fonction f
    void f() { /* du code */ }

    Voici la déclaration d'une classe T
    struct T;
    Voici la définition d'une classe T
    struct T { /* des membres */ };

    Voici la déclaration d'une variable
    T variable;
    Voici la définition d'une variable
    T variable = valeur;

  9. #9
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Alp Voir le message
    Effectivement. Mais en la séparant, le compilo je crois risque de faire sauter l'inline.
    Si je déclare une fonction inline dans une classe et que j'en mets la définition dans le .cpp, le compilateur la considèrera comme une fonction à part entière?

  10. #10
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    Citation Envoyé par Charlemagne Voir le message
    Mets toi à la place du compilateur, comment tu ferais pour généré du code assembleur dont tu ignorerais le code source?...
    Je doute que le compilateur soit incapable de trouver une telle fonction puisqu'en dispatchant un peut partout dans les .ccp les fonctions non-inline, il se débrouille quand même pour les lier à la classe. donc de là à les recopier en remontant un peu plus... ça ne fait qu'un pas de plus. (bon, ça fait faire une édition des liens avant la génération du code, mais ça doit pas être impossible non ?


    Citation Envoyé par Alp Voir le message
    Effectivement. Mais en la séparant, le compilo je crois risque de faire sauter l'inline.
    Oui, mais pourquoi peut-on les séparer dans des .h et pas dans des .ccp ?


    Citation Envoyé par loufoque Voir le message
    Tu confonds manifestement déclaration et définition.
    Heuuu.. effectivement, désolé .



    Citation Envoyé par spoutspout Voir le message
    Si je déclare une fonction inline dans une classe et que j'en mets la définition dans le .cpp, le compilateur la considèrera comme une fonction à part entière?
    ben non, comme une inline... enfin s'il l'accepte (c'est à dire si tu l'appelle pas d'un autre .ccp...).

    sinon, merci à tous pour vos réponses

  11. #11
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Points : 833
    Points
    833
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    Bonsoir.
    [..]je déteste mettre autre chose que des définitions dans les .h[..]
    [..]D'autre part, j'esperais savoir si le fait de mettre ces définitions dans un .h externe (du genre finline.h ) permettait de garder la propriété inline [..])
    Un bon usage est en effet de mettre les inline dans une en-tête séparée .inl ou .i.hpp ou ce que tu veux.
    Exemple: tropclasse.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifndef TROP_CLASSE_HPP
    #def TROP_CLASSE_HPP
    Class tropclasse
    {
      tropclasse();
    /*declarations*/
    };
    #include "tropclasse.i.hpp"
    #endif
    tropclasse.i.hpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include "tropclasse.hpp"
     
    inline
    tropclasse::tropclasse()
    {
    }
    Enfin c'est juste une des nombreuses (et bonne) façons de faire.

  12. #12
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Citation Envoyé par Charlemagne Voir le message
    Parce que tu inclus des fichiers .h et non des .cpp.
    Le compilateur doit connaitre le contenu d'une fonction inline pour le mettre directement dans le code appelant (sans appel de fonction donc, par définition).

    Mets toi à la place du compilateur, comment tu ferais pour généré du code assembleur dont tu ignorerais le code source?...
    Ben, techniquement c'est pas impossible.

    Tu fais un code assembleur intermédiaire avec des marqueurs spéciaux, et tu refais une seconde passe en cherchant le code source dans tous les .o générés.

    C'est plus long certes.

  13. #13
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    Citation Envoyé par befalimpertinent Voir le message
    Un bon usage est en effet de mettre les inline dans une en-tête séparée .inl ou .i.hpp ou ce que tu veux.
    mais est-t'il possible de mettre un hpp par .h (je penssait à un .h regroupant plusieurs h....) et, dans ce cas, à quoi servent les .cpp ?

  14. #14
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    N'oubliez pas qu'un compilateur n'a aucune notion de .cpp, .h, etc... Il a un fichier à compiler (peut importe son extension) qui en inclue potentiellement d'autres (peu importe leurs extensions). Cela forme une unité de compilation.

  15. #15
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    Citation Envoyé par Sylvain Togni Voir le message
    N'oubliez pas qu'un compilateur n'a aucune notion de .cpp, .h, etc... Il a un fichier à compiler (peut importe son extension) qui en inclue potentiellement d'autres (peu importe leurs extensions). Cela forme une unité de compilation.
    Donc si je fait quelque-chose comme dans mon .h,
    je pourrais régler le problème des inline ?

  16. #16
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Points : 833
    Points
    833
    Par défaut
    Edit Ne pas tenir compte je pensais que c'était ton source (j'avais lu cpp)
    Citation Envoyé par méphistopheles Voir le message
    Donc si je fait quelque-chose comme dans mon .h,
    je pourrais régler le problème des inline ?

    Règle du bon programmeur: Ne jamais inclure une source dans un header !

    Surtout qu'en incluant t'on propre source tu crées une boucle (le header inclue le source qui inclue le header) et ton compilo ne va pas être content.

    Pour le reste:
    Que se passe-t-il avec les fonctions inline ?

  17. #17
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    Donc si je fait quelque-chose comme dans mon .h,
    je pourrais régler le problème des inline ?
    Le nom utilise est generalement nomcode.ipp (et moncode.tpp pour le code des templates).

  18. #18
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par HanLee Voir le message
    Ben, techniquement c'est pas impossible.

    Tu fais un code assembleur intermédiaire avec des marqueurs spéciaux, et tu refais une seconde passe en cherchant le code source dans tous les .o générés.

    C'est plus long certes.
    Ca pose des tonnes d'autres problèmes - que faire si tu ne compile que ton fichier cpp et aucun autre ? ou est-ce que le compilateur va trouver le code de la fonction inline ? D'ailleurs, dans quel fichier est-il censé le trouver ? (je rappelle que les options de compilation te permettent de renommer les fichiers .o en sortie de la compilation, donc le compilateur ne peut rien deviner par lui-même).

    Ca pourrait être OK si c'est fait an link time, mais avec quel coût ?

  19. #19
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    Citation Envoyé par befalimpertinent Voir le message
    Surtout qu'en incluant t'on propre source tu crées une boucle (le header inclue le source qui inclue le header) et ton compilo ne va pas être content.
    bheu non, les #ifndef sont fait pour ça non ? :p

    Citation Envoyé par Emmanuel Deloget
    Ca pose des tonnes d'autres problèmes
    déjà que j'avais à moitié compris la proposition de HanLee

  20. #20
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    bheu non, les #ifndef sont fait pour ça non ? :p
    Par contre, tu fait quoi pour ce cas:

    définition.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include "declaration.h"
     
    (code)
    declaration.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef TOTO
    #define TOTO
     
    (declarations)
     
    #include "definition.cpp"
    lorsque tu compiles definition.cpp ? A moins que tu ne le compiles pas?

    Sérieusement, si tu ne souhaites pas mettre ton code dans ton fichier header, mets le dans un fichier .inl - ne t'amuse pas à faire des fichiers-cpp-qui-ne-sont-pas-des-fichiers-cpp-en-fait. Je te promets que le premier que je trouve dans mon équipe à faire ça se prends une engueulade mémorable et humiliante devant tout le reste de l'équipe par le chef (en l'occurence, moi). Avec changement d'affectation le temps que cette personne apprenne la programmation.

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/03/2009, 13h14
  2. Réponses: 1
    Dernier message: 31/12/2008, 16h50
  3. Réponses: 11
    Dernier message: 15/09/2008, 10h25
  4. Pourquoi ne peut-on pas instancier de tableau paramétré ?
    Par LGnord dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 28/03/2008, 08h59

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