9
votes

Comment puis-je convertir idiomatiquement un bool en bool?

Le L'en-tête est livré avec son propre type bool . Regardant à la mise en œuvre, il semble false est juste une macro pour 0 et true est juste une macro pour 1 , mais je ne suis pas sûr que cela soit spécifié.

Quel est le moyen idiomatique de convertir un bool en un bool ? Je peux imaginer beaucoup de manières possibles: xxx


14 commentaires

Qu'entendez-vous par «idiomatique»?


bool c = (x == faux) ? :)


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; me donne un avertissement de compilateur.


@hidrargyro um. Non ce n'est pas le cas. bool e = !! 7; est parfaitement valide c ++ (bien qu'un peu impair). bool e = 7 n'est pas. Vous obtiendrez un avertissement sur la conversion.


J'utiliserais probablement static_cast 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) et la moitié du code Win32 en existence reposent sur au moins false étant 0, je pense qu'il est prudent de supposer que c'est et ne changera pas.


@Whzcraig !! 7 ? Est-ce le jumeau diabolique de 007 ? :)


@WhozCraig: bool e = 7; est également parfaitement valide C ++. Pourquoi un compilateur devrait-il avertir? (g ++ ne pas, même avec -std = c ++ 11 -petic -wall -wextra )


@Frederverflow Absolument. Faire pire des choses d'une manière vériosité de la MS-Mode, il existe des endroits (tels que getMessage () où ils vous disent réellement d'évaluer le résultat BOOL en tant que int pour percer potentiellement Mesures multiples de la manière dont cette fonction peut revenir. amour 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 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.


5 Réponses :


8
votes

Il n'y a pas besoin de conversion explicite: xxx pré>

la conversion implicite d'un type numérique sur BOOL code> rendement false code> pour une valeur de 0 code> et vrai code> pour toute valeur non nulle. p>

Incidemment, vous nous avez dit comment définit false code> et true code>. Comment définit-il bool code>? (De votre commentaire, c'est Typef int bool; code>) p>

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> xxx pré>

mais selon Ce compilateur Visual C ++ en ligne , VC ++ produit un avertissement: P> xxx pré>

même avec un static_cast code>, il produit toujours l'avertissement. p>

Vous pouvez éviter l'avertissement en utilisant !! x code> ou x? VRAI: FALSE code>. Mais je ne suis pas sûr que le remède est meilleur que la maladie. P>

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 c = (x == TRUE);


8 commentaires

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 Avertissez une conversion implicite de int sur bool . 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.



0
votes

Il est difficile de dire comment le programmateur Win32 le ferait-il, mais je devrais être fait par: xxx

ou xxx

Je pense que c'est une mauvaise pratique de relâcher sur la macro (ou toute autre chose prédéfinie)
Constance.

Un jour vrai peut devenir 0 et faux 1;)



0
votes

6 commentaires

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 à int 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 Vous faites référence à?


@Benvoigt, c'est celui qui est, merci. J'ai effectivement cessé de mettre dans le > 0 après cela.



0
votes

4 commentaires

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 .


Un nom contenant un double soulignement est réservé partout . Cela n'a rien à voir avec votre code 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;}


Je vis et j'apprends, mais j'aime toujours l'ancien nom _bool :) Pensez-vous que je suis en sécurité avec la nouvelle version - édité?



0
votes

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;


0 commentaires