Partage
  • Partager sur Facebook
  • Partager sur Twitter

#define une chaîne de caractères

    23 mars 2022 à 12:13:29

    Bonjour j aurais aime savoir si il était "propre" de définir une chaîne de caractères avec un define comme un chemin

    Ex : #define "/file1/file2"

    -
    Edité par AnatoleFarenc 23 mars 2022 à 12:14:14

    • Partager sur Facebook
    • Partager sur Twitter
      23 mars 2022 à 13:00:12

      Bonjour,

      c'est une macro, donc tu as les avantages et aussi les inconvénients des macros … mais surtout il faut penser à donner un nom à ta macro (qui usuellement sera tout en majuscule).

      #define ROOT_DIR "/dir1/dir2/file.ext"

      L'avantage indéniable est que la macro est remplacée directement dans ton code au moment de la phase du préprocesseur. Il y a peu d'inconvénients lorsqu'il s'agit de chaînes littérales. Tu peux même utiliser la concaténation inline de chaîne.



      • Partager sur Facebook
      • Partager sur Twitter
        23 mars 2022 à 14:13:27

        L'avantage évident est que tu n'aurais besoin de le modifier qu'à un seul endroit.
        • Partager sur Facebook
        • Partager sur Twitter

        Le Tout est souvent plus grand que la somme de ses parties.

          23 mars 2022 à 16:49:57

          Qu es que tu entends par concatenation inline
          • Partager sur Facebook
          • Partager sur Twitter
            23 mars 2022 à 17:30:31

            Bonjour,

            Utiliser un define pour une chaine constante est plutôt "propre". Mais si on compare à d'autres possibilités ça n'est peut-être pas judicieux.

            #define CHEMIN1  "/file1/file2"
            const char  Chemin2[] = "/file1/file2";
            const char*  const Chemin3 = "/file1/file2";

            La troisième n'a pas beaucoup d'intérêt par rapport à le seconde.

            Avantage de CHEMIN1:
            - il peut être mis simplement dans un fichier header
            - ne consommera aucune mémoire s'il n'est finalement pas utilisé dans le code.
            - on peut l'utiliser en concaténation inline comme l'indique WhiteCrow
            exemple : FILE* pf = fopen( CHEMIN1 "/fichier.txt" , "r" );

            Avantage de Chemin2:
            - Sera plus optimal si on doit l'utiliser dans un entête utilisé dans plusieurs unités des compilation (alors que le define va générer au moins une nouvelle instance du texte dans chaque unité de compilation l'utilisant.)
            - Permet de séparer la définition de la déclaration, le fichier d'entête n'aura que le nom de la variable et le contenu reste masqué.
            Ceci au détriment de la simplicité de juste mettre un define. C'est pourquoi je pense que le define est la solution la plus utilisée.

            Petit aparté pour ceux qui comme moi utilisent parfois le C, parfois le C++:
            En C++, les 3 cas ci-dessus sont possibles mais on préfèrera utiliser:

            constexpr char Chemin4[] = "/file1/file2";

            Qui lui peut tout à fait être utilisé sans contrainte dans un entête (les constexpr sont inline), levant  l'intérêt du define

            • Partager sur Facebook
            • Partager sur Twitter

            En recherche d'emploi.

              23 mars 2022 à 21:55:33

              D'accord merci beaucoup pour tt ses explications précises je pense donc utiliser le define qui sera plus judicieux dans mon cas 😄

              • Partager sur Facebook
              • Partager sur Twitter
                23 mars 2022 à 23:07:40

                Dalfab a écrit:

                En C++, les 3 cas ci-dessus sont possibles mais on préfèrera utiliser:

                constexpr char Chemin4[] = "/file1/file2";
                Si tu vas dire ça sur le forum C++ ils vont te brûler sur le bûcher en disant qu'il faut utiliser std::string_view

                • Partager sur Facebook
                • Partager sur Twitter
                  24 mars 2022 à 0:15:39

                  Oui, mais on est dans la catégorie du langage C, pas C++
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le Tout est souvent plus grand que la somme de ses parties.

                    24 mars 2022 à 13:36:06

                    JadeSalina a écrit:

                    Dalfab a écrit:

                    En C++, les 3 cas ci-dessus sont possibles mais on préfèrera utiliser:

                    constexpr char Chemin4[] = "/file1/file2";

                    Si tu vas dire ça sur le forum C++ ils vont te brûler sur le bûcher en disant qu'il faut utiliser std::string_view

                    Je m'en défendrais car :
                    - le tableau constexpr est convertible sans coût en std::string_view si nécessaire.
                    - utiliser std::string_view fait perdre le terminateur de chaîne, ce qui pourrait poser problème.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    En recherche d'emploi.

                      24 mars 2022 à 16:09:20

                      Ok, mais c'est une chaîne de style C (tableau de char) et sur le forum C++ ça leur donne de l'urticaire !
                      • Partager sur Facebook
                      • Partager sur Twitter

                      #define une chaîne de caractères

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      • Editeur
                      • Markdown