Partage
  • Partager sur Facebook
  • Partager sur Twitter

Résoudre un problème d'inclusion multiple

Sujet résolu
    18 août 2017 à 13:05:47

    Bonjour,

    J'ai lu dans ce cours (dans l'exemple 3 de ce cours : https://fr.wikibooks.org/wiki/Programmation_C%2B%2B/Le_pr%C3%A9processeur) que l'inclusion multiple de fichier header est inévitable. Il faut donc utiliser ceci

    #ifndef ...
    #define ...
    
    #endif

    ou

    pragma once

    qui ne fonctionne qu'avec certains compilateurs.

    J'ai repris l'exemple 3 du cours cité précédemment comme exemple à ma question.

    Pourquoi ne peut-on pas faire ça pour résoudre l'inclusion multiple ?

    Car cela voudrait dire "toto.h" est inclus dans "A.h" qui est inclus dans "B.h" qui est inclus dans "C.h". Certes, ce n'est pas très propres mais de cette manière l'inclusion multiple est évitable, non ? (Je sais bien que j'ai tort mais j'aimerais bien comprendre pourquoi)

    -
    Edité par seba110298 18 août 2017 à 13:06:42

    • Partager sur Facebook
    • Partager sur Twitter
      18 août 2017 à 14:35:11

      >qui ne fonctionne qu'avec certains compilateurs.

      Heu, c'est quoi les compilateurs qui le supporte pas ? (compatible C++11 au moins, on n'est plus au XXème siècle)

      Je pense que vous vous posez ce type de question parce que vous voyez les headers comme une contrainte et pas comme un formidable outil de structuration/aide à la conception qu'ils sont devenus.

      Le principe cardinal d'une conception, c'est de limiter les dépendances entre mes "modules" pour simplifier le travail (principe du "diviser pour régner").

      Donc moins de dépendances, donc indirectement moins d'includes. Sauf qu'ici, vous ne supprimez pas les dépendances, vous les cachez.

      Votre classe C a toujours besoin de la classe A, mais vous l'avez caché. Et cacher des trucs, c'est jamais bon.

      En plus de cacher la dépendance entre les classe A et C, vous obligez tous les utilisateurs de classe B à avoir une dépendance avec la classe A, même si elles n'en ont pas besoin.

      Ne voyez pas les headers comme de la tuyauterie mais comme un moyen de signaler toutes les "vraies" dépendances qu'à un code source dans un .cpp. Et un moyen de signaler les dépendances que les déclarations spécifiées dans un .h ont engendré par les types utilisés en classe de base, en type des champs ou en type de paramètre ou en type de valeur de retour.

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        18 août 2017 à 15:12:28

        bacelar a écrit:

        >qui ne fonctionne qu'avec certains compilateurs.

        Heu, c'est quoi les compilateurs qui le supporte pas ? (compatible C++11 au moins, on n'est plus au XXème siècle)

        C'est ce qui est marqué dans le cours (je suppose qu'il doit être vieux dans ce cas).

        Pour le reste, je vois exactement où vous voulez en venir, et je ne voyais pas cela du tout comme de la tuyauterie. En fait, ma vraie question était plutôt de savoir, pourquoi dans le cours ils disent ça :

        "...Pour résoudre l'inclusion multiple de fichier headers (inévitable), on va faire commencer le fichier header par #ifndef TOTO_H et il se termine par #endif. Si la variable de compilation TOTO_H n'est pas définie, alors le header sera inclus, sinon, il sera tout simplement vide. Juste après #ifndef TOTO_H, nous allons écrire #define TOTO_H définissant justement cette variable de compilation TOTO_H..."

        alors qu'elle est en théorie évitable... En pratique on ne fera évidemment jamais ce que j'ai fait.

        En fait, étant donné qu'il était marqué "inévitable", je pensais qu'on ne pouvait pas faire ce que j'ai dit, et je voulais comprendre pourquoi. Mais d'après ce que vous me dites, je comprends donc que c'est possible mais qu'il est marqué "inévitable" car ce que j'ai fait n'a aucune raison d'exister (mauvaise, très mauvais utilisation des includes).

        • Partager sur Facebook
        • Partager sur Twitter
          18 août 2017 à 15:50:40

          >alors qu'elle est en théorie évitable.

          Si l'évitement consiste à faire des dépendances cachées dans tous les sens et rendre vos classes totalement inutilisables, ce n'est pas une "vraie" solution.

          Et on ne cherche pas à éviter les inclusions multiples, on respecte les règles, les conventions, les bonnes pratiques pour que celles-ci nous rendent services.

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            18 août 2017 à 16:38:35

            D'accord, merci pour votre aide
            • Partager sur Facebook
            • Partager sur Twitter
              18 août 2017 à 20:40:04

              Bonjour,

              #pragma once n'est pas du tout demandé par la norme. Donc il n'est pas garanti qu'il fonctionne avec tous les compilateurs, le cours a raison.
              Le problème est inévitable dans certains cas, et le seul moyen de l'éviter serait d'utiliser un #ifdef particulier. Alors autant utiliser cette technique d'avoir un #ifndef en début de fichier. Attention, il est important d'utiliser un terme totalement garanti unique dans le #define. Le nom du fichier ne suffit pas car dans des hiérarchies énormes de répertoires on n'est jamais sûr que des noms de fichiers ne soient pas réutilisés. On peut donc trouver des séquences du type :

              #ifndef TOTO_H_20171808_A012AB012F
              #define TOTO_H_20171808_A012AB012F
              
              #endif
              • Partager sur Facebook
              • Partager sur Twitter

              En recherche d'emploi.

                21 août 2017 à 14:13:31

                J'ai du mal à comprendre pourquoi ce faire du mal avec des "#indef" plutôt que de maitre des "#pragma once" en interne et faire une mécanique de remplacement de celui-ci via des GUID automatiquement en exportant du gestionnaire de code source.
                • Partager sur Facebook
                • Partager sur Twitter
                Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

                Résoudre un problème d'inclusion multiple

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown