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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    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
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 737
    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 737
    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
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Alp
    Alp est déconnecté
    Expert confirmé

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 737
    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 737
    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
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Alp
    Alp est déconnecté
    Expert confirmé

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

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

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    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.

  8. #8
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    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 ?
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    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 ?
    Ah mais j'ai pas dit que ça serait simple sur le modèle de compilation actuel, qui est tout de même très vieillot.

    Oui je pensais au link time, d'où une passe de préprocessing. Puis tu sais, le link-time c'est quand même très rapide par rapport à la compilation.

    OCaml par exemple fait de l'inlining inter-unités de compilations, sachant que les compilateurs d'OCaml ont un modèle de compilation identique au C, à quelques détails près.

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Les compilateurs modernes font de l'inlining au link-time (par exemple, option whole program optimisation sous MsDev à partir de la version 8).

    Par contre, un des buts initiaux du C++ était de pouvoir s'insérer dans les outils classiques du C, et il ne pouvait donc pas exiger ça d'un compilateur. D'où la contrainte de visibilité du code pour lequel l'utilisateur suggère un inlining.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    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 Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    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 ?

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