Le Quel est le moyen idiomatique de convertir un
bool code>. Regardant à la mise en œuvre, il semble
false code> est juste une macro pour
0 code> et
true code> est juste une macro pour
1 code >, mais je ne suis pas sûr que cela soit spécifié.
bool code> en un
bool code>? Je peux imaginer beaucoup de manières possibles: p>
5 Réponses :
Il n'y a pas besoin de conversion explicite: la conversion implicite d'un type numérique sur Incidemment, vous nous avez dit comment Mais certains compilateurs peuvent avertir cette conversion implicite, même s'il est un code parfaitement valide. Les compilateurs sont libres d'avertir de tout ce qu'ils aiment, y compris la police lachée que vous avez utilisée pour écrire votre code. g ++, par exemple, ne se plaint pas de la conversion, même avec: p> mais selon même avec un Vous pouvez éviter l'avertissement en utilisant La voie simple et correcte de le faire est simplement d'attribuer la valeur et de compter sur la conversion implicite pour faire la bonne chose (elle sera ). P> Si vous avez une exigence supplémentaire pour éviter les avertissements du compilateur, cela devient plus une question sur Visual C ++ plutôt que la langue C ++. Il peut également y avoir un moyen d'inhiber certains avertissements sans changer la source - bien que ces risques perdent ces mêmes avertissements quand ils ont du sens. Dans un commentaire, Dieter Lücking suggère: P> BOOL code> rendement
false code> pour une valeur de
0 code> et
vrai code> pour toute valeur non nulle. p>
false code> et
true code>. Comment définit-il
bool code>? (De votre commentaire, c'est
Typef int bool; code>) p>
static_cast code>, il produit toujours l'avertissement. p>
!! x code> ou
x? VRAI: FALSE code>. Mais je ne suis pas sûr que le remède est meilleur que la maladie. P>
bool c = (x == TRUE);
Cela me donne un avertissement de compilateur. Sinon, je n'aurais pas demandé :)
@Fredoverflow: Quel est l'avertissement? (Et pourquoi n'es-tu pas mentionné cela et citer l'avertissement, dans votre question initiale?) Les compilateurs peuvent avertir de tout ce qu'ils aiment; GCC, par exemple, ne met pas i> Avertissez une conversion implicite de int code> sur
bool code>. Et s'il vous plaît mettre à jour votre question pour montrer que TEPDEF.
Désolé, je ne peux pas reproduire l'avertissement à la maison, car je n'ai pas de studio visuel installé ici. Je te reviendrai demain!
@Fredoverflow, il y a un compilateur MSVC11 et CTP en ligne s'il aide: hausse4fun.com/vcpp
@Keiththompson, je suppose: # avertissement #pragma (désactiver: 4800) // forçant la valeur pour bool 'true' ou 'faux' (avertissement de performance)
Re: "retourne à leur implémentation C" ... L'interface est toujours compatible C89, qui est un résultat nécessaire des exigences de compatibilité en arrière. La mise en œuvre n'a pas d'importance, les types de retour font partie de l'interface.
@Benvoigt: Je vais toujours blâmer Microsoft, que ce soit vraiment leur faute ou non. 8-)}
La distribution statique produisant un avertissement est juste ... mauvais.
Il est difficile de dire comment le programmateur Win32 le ferait-il, mais je devrais être fait par: ou p> Je pense que c'est une mauvaise pratique de relâcher sur la macro (ou toute autre chose prédéfinie) Un jour vrai peut devenir 0 et faux 1;) p> p>
Constance. P>
Ce jour-là est maintenant, en quelque sorte: variante_bool code> A> peut être attribué
variant_false code> et
variante_true code> avec ce dernier étant défini comme
(court) -1 code>, dans d'autres mots 0XFFFF. Sous Windows, je suggérerais toujours d'utiliser
bool d = (x! = False); code>. Vous ne pouvez pas vous attendre à ce que tout le monde sur votre équipe sache comment convertir de
variant_bool code> en
bool code> correctement.
Il n'y a pas de moyen sûr de le faire, car Win32 bool code> a
Cela suppose que vous devez conserver ces valeurs. Si elle est utilisée sanely, vous ne devriez que vous soucier de savoir si sa vérité ou une falsification.
@Keith: C'est vrai pour de nombreuses API, mais celle que j'ai liée à retourner des valeurs de trois classes d'équivalence.
C'est une API stupide, stupide et stupide. (Modification du type de retour de bool code> à
int code> résoudrait ce problème et ne faisant aucune différence pour l'API.)
C'est vraiment, mais comme Raymond Chen a expliqué une fois une fois, il ne peut y avoir une erreur que si vous faites quelque chose de stupide en passant dans les arguments. Cela ne retournera pas une valeur inférieure à 0 à moins que ce soit de votre faute. Pourtant, il pourrait y avoir d'autres personnes qui utilisent quelque chose de similaire à un tribo.
@chris: Je suppose C'est l'explication a > Vous faites référence à?
@Benvoigt, c'est celui qui est, merci. J'ai effectivement cessé de mettre dans le > 0 code> après cela.
J'utilise une macro: imo, rend mon code plus lisible. p> édité: strong>
Un commentateur a contesté mon utilisation de soulignement dans le nom de la macro. Pour résoudre ce problème, voici une nouvelle version qui est toujours générique et utilise toujours le même nom _bool code>, mais est conforme, selon Ce . p>
Les noms qui commencent par un trait de soulignement dans l'espace de noms global sont Réservé .
Pas un problème pour moi. Cette macro est utilisée uniquement par mon propre code et se développe par pré-processeur, le compilateur et les espaces de noms ne savent rien à ce sujet. Quoi qu'il en soit, on peut utiliser __ bool code>.
Un nom contenant un double soulignement est réservé partout b>. Cela n'a rien à voir avec votre code b> non plus. Les règles sont là pour empêcher les affrontements de nom avec la mise en œuvre C ++. Vous ne voulez certainement pas qu'un en-tête de bibliothèque standard incluait la garde au conflit avec le code en l'utilisant. Une alternative sûre serait: bool bool_ (const bool b) {return !! b;} code>
Je vis et j'apprends, mais j'aime toujours l'ancien nom _bool code> :) Pensez-vous que je suis en sécurité avec la nouvelle version - édité?
est un peu une question d'opinion, mais je pense qu'il ya des arguments objectifs à réaliser pour les différentes options
Le meilleur choix est le suivant:. P>
bool f = x;
Qu'entendez-vous par «idiomatique»?
bool c = (x == faux) code>? :)
Ceci est probablement inapproprié pour donc parce qu'il se résume au goût personnel, je crois.
bool e = !! x; est la même chose que bool e = x; ;)
@ Michałwalenciak Cela signifie "Comment puis-je le faire d'une manière que tout programmeur Win32 reconnaître immédiatement et ne le fait pas partir" hein? "".
@Hidrargyro no,
bool e = x; code> me donne un avertissement de compilateur.
@hidrargyro um. Non ce n'est pas le cas.
bool e = !! 7; code> est parfaitement valide c ++ (bien qu'un peu impair).
bool e = 7 code> n'est pas. Vous obtiendrez un avertissement sur la conversion.
J'utiliserais probablement
static_cast code> pour éviter l'avertissement, mais c'est plus préférentielle personnelle. Je suis sûr qu'un bon nombre de personnes préféreraient le doubler. Quoi qu'il en soit, lorsque toutes sortes de documentation utilisent
si (! OfCunctionCunctionTurningbool) code> et la moitié du code Win32 en existence reposent sur au moins
false code> étant 0, je pense qu'il est prudent de supposer que c'est et ne changera pas.
@Whzcraig
!! 7 code>? Est-ce le jumeau diabolique de
007 code>? :)
@WhozCraig:
bool e = 7; code> est également parfaitement valide C ++. Pourquoi un compilateur devrait-il avertir? (g ++ ne pas, même avec
-std = c ++ 11 -petic -wall -wextra code>)
@Frederverflow Absolument. Faire pire des choses d'une manière vériosité de la MS-Mode, il existe des endroits (tels que
getMessage () code> où ils vous disent réellement d'évaluer le résultat BOOL en tant que
int code> pour percer potentiellement Mesures multiples de la manière dont cette fonction peut revenir. amour i> ces gars.
@KeithThompson dans quelle mesure intéressante. My Clang (bien qu'un peu d'un bidouillage) aboie de «perte potentielle de données» bla bla. Peut-être que je devrais mettre à jour mes sources et lui donner un autre essai.
@Whlzcraig: compilateurs peut i> avertir de tout ce qu'ils aiment, y compris "Vous avez utilisé une police lachée pour écrire ce code". Et avertissement sur une perte d'informations possibles sur une conversion implicite rend une certaine quantité de sens - mais dans ce cas particulier, je dirais que c'est surchargé.
@Keiththompson je suis d'accord. Cela semble quelque peu balistique.