Bonjour tous le monde
quelqu'un sait il comment dans :
je peut récupérer 'valeur' et pas 1 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part #define valeur 1
merci d'avance
Bonjour tous le monde
quelqu'un sait il comment dans :
je peut récupérer 'valeur' et pas 1 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part #define valeur 1
merci d'avance
Bonjour,
Qu'est ce que tu veux dire par récupérer ?
Cours : Initiation à CMake
Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
Ce message a été tapé avec un clavier en disposition bépo.
avec un printf par exemple, je voudrais que soit affiché "valeur" en toutes lettres et pas 1
Eh bien… non, c'est tout à fait impossible !
Pour que tu comprennes bien pourquoi, il faut que tu imagines que le préprocesseur (le programme appelé avant la compilation et qui s'occupe, entre autres, des #define) agit ni plus ni moins comme la fonction rechercher/remplacer de ton éditeur de texte. Si bien que la chaîne « valeur » n'existe plus lorsque la compilation commence.
Que cherches-tu à faire, exactement ?
Cours : Initiation à CMake
Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
Ce message a été tapé avec un clavier en disposition bépo.
pour mon programme ; rien en particulier avec "valeur";
je passe par les #define pour plus de lisibilité dans le prog et je voulais pouvoir afficher "valeur" a l'écran pendant l'exécution à titre d'information.
si on peut pas, je le ferais pas
merci pour la réponse
Salut,
De manière générale, les #define sont très largement déconseillés en C++, du simple fait du fonctionnement même du préprocesseur.
Si tu souhaite disposer de valeur explicites, envisage peut-être de te tourner vers des énumérations, voire vers des valeurs statiques constantes, bien que cette dernière solution ne soit pas *forcément* bien meilleure que le recours à #define.
les avantages de l'énumération, sont:
- que tu dispose, en plus de la possibiliité de regrouper l'ensemble des valeurs "qui vont bien ensemble":
- que tu dispose d'une vérification du type (tu ne peux pas utiliser un identifiant qui ne fasse pas partie de l'énumération, si tu a déclaré une variable du type de celle-ci)
En effet, imaginons le cas "classique" des define, dans lequel j'ai intentionnellement glissé quelques erreurs:
Au cas où tu ne l'aurais pas remarqué, j'ai "simplement" inversé la valeur de FileOpen et de FileNotOpen.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #define Good 1 #define Bad 0 #define FileOpen 0 #define FileNotOpen 1 #define fileRead 2 #define FileWrite 4 #define FileBinary 8 #define FileText 16 #define NoError 1 #define ErrorOccured 0
En effet, en terme de valeur, FileNotOpen correspondrait bien plus à un état d'erreur, et donc à Bad ou à ErrorOccured, et, inversément, FileOpen correspondrait bien plus à un état sans erreur, et donc à Good ou à NoError.
Or, le préprocesseur est un "brave petit soldat qui obéit sans poser de question", et, lorsqu'il va faire son job, il va donc remplacer FileOpen par... 0 et FileNotOpen par... 1.
Au final, quand le compilateur rencontrera un test du genre de if(valeur == FileOpen), il réagira exactement de la même manière que s'il avait rencontré un test du genre de if(valeur == Bad) ou de if(valeur == ErrorOccured), ce qui ne correspond pas à la réalité "sémantique" du problème
Mais les problèmes ne s'arrêtent pas là.
Tu l'aura compris, tous les define File* ont trait... à la gestion de fichiers.
Comme pour le préprocesseur, les "tokens" définis ne sont finalement que des valeurs, il ne se rend absolument pas compte du fait qu'ils pourraient être groupés par deux, ni qu'ils font partie d'un ensemble "complet".
Alors que, si tu travailles avec une énumération proche de (dans un autre contexte, car celui de la gestion d'un état de fichier ne correspond pas à la démonstration que je veux faire)
si, déjà, tu déclare une variable de type eMyEnum, tu ne pourra déjà pas lui donner une autre valeur que meBrol, meTruc, meChose, meBidule ou meMachin.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 enum eMyEnum { meBrol, meTruc, meChose, meBidule, meMachin };
Mais, de plus, si tu en viens à envisager un test à choix multiple sous la forme de
enum eMyEnum e;
le compilateur - pour autant qu'il soit bien réglé - t'enverra un avertissement pour chaque valeur que tu n'aurais pas pris en compte dans ton switch.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 switch (e) { case meBrol: doSomething(); break; case meTruc: doSomethingElse(); break; /* tu n'a pas pensé à meChose, meBidule ou meMachin. et tu * n'a pas prévu de cas par défaut */ }
Au final, tu te rend compte que tu n'a que des avantages à utiliser une énumération![]()
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Partager