Warnung entfernen



  • Folgender Code:

    file<<static_cast<bool>(byte & (1<<i));
    

    Ich pruefe also welche der 8 Bits gesetzt sind und will dementsprechend "0" oder "1" in die Datei schreiben. Byte ist std::uint8_t. Funktioniert auch, allerdings mit Warnung:

    warning C4800: 'int': Variable wird auf booleschen Wert ('True' oder 'False') gesetzt

    Scheinbar hilft der Cast gar nichts


  • Mod

    Das sollte eigentlich keine Warnung produzieren, denn das ist keine Pitfall.
    Ignorieren.

    P.S.: Du willst also das Byte binär in den Stream schieben? Falls du C++11 zur Verfügung hast, nutze bitset.



  • Wwwwarnung schrieb:

    Scheinbar hilft der Cast gar nichts

    Nee, hilft bei MSVC nicht. Deswegen benutze ich da den not-not-Trick.

    file<<!!(byte & (1<<i));
    


  • oder vernünftig:

    (byte & (1<<i)) != 0
    

  • Mod

    Ach, hier geht es darum, die Warnung mit Tricks zu entfernen?

    Deswegen benutze ich da den not-not-Trick.

    Schon merkwürdig, das VC++ es hier sieht, da aber nicht.

    Sieht es das bei einem function-style-cast?



  • Lieber Stern, lies bitte den MSDN Eintrag zu dieser Warning, da steht genau beschrieben worum es geht.
    Dann musst du dich auch weniger wundern.


  • Mod

    hustbaer schrieb:

    Lieber Stern, lies bitte den MSDN Eintrag zu dieser Warning, da steht genau beschrieben worum es geht.

    Das habe ich :).

    This warning is generated when a value that is not bool is assigned or coerced into type bool.

    Volkards Variante sollte demnach also eine Warnung produzieren.
    Daher wundere ich mich.

    Meine Frage zum function style cast ist damit aber geklärt:

    Casting the expression to type bool will not disable the warning, which is by design.

    Alle Casts haben sie also speziell behandelt.



    • schrieb:

    hustbaer schrieb:

    Lieber Stern, lies bitte den MSDN Eintrag zu dieser Warning, da steht genau beschrieben worum es geht.

    Das habe ich :).

    Ja, jetzt. Davor offensichtlich nicht.

    This warning is generated when a value that is not bool is assigned or coerced into type bool.

    Volkards Variante sollte demnach also eine Warnung produzieren.
    Daher wundere ich mich.

    Wenn du coerced into type bool unbedingt so verstehen willst dass es auch !int_value mit einschliesst, dann ja.
    Was aber spätestens mit

    'type' : forcing value to bool 'true' or 'false' (performance warning)

    klar sein sollte: bei der Warning geht's nicht darum dass der Compiler Angst hat dass man was falsch macht. Sie soll ein Tip sein, dass man was macht, was u.U. nicht unbedingt schnell ist.
    Das war nämlich zu Zeiten wo die meisten CPUs CMOV noch nicht unterstützt haben und schlechte Branch-Prediction hatten, aber bereits sehr tiefe Pipelines, relativ teuer.

    Und dass es mächtig nervt, wenn ein Tip, wie man was besser machen könnte, an vielen Stellen kommt, wo man etwas für C(++) ganz normales macht, nämlich if (int_value) bzw. if (!int_value) zu schreiben, sollte klar sein.
    Davon abgesehen wäre sie dort auch nicht wirklich angebracht, denn ein if (int_value) oder if (!int_value) ist genau so schnell oder langsam wie ein if (bool_value) . Den bedingten Sprung kann man bei if ja schwer einsparen. Ausser eben manchmal über CMOV .

    Einzig bei einer Zuweisung mit !int_value (oder eben !!int_value ) wäre diese performance warning noch angebracht. Denn das hätten auch damals Compiler schon ohne CMOV mit bool schneller machen können als mit int . Andrerseits war es damals auch noch nicht so "in" standardkonformen Code zu schreiben. Und da ein über XOR reg, 1 implementiertes ! bei nicht standardkonformem Code zu einigen Problemen führen kann, würde mich fast wundern, wenn MSVC das so gemacht hätte.



  • hustbaer schrieb:

    Das könnte der Grund sein, warum !!c geht. Der bool-cast im !c warnt vielleicht (by design) deswegen nicht, weil er eh fast nur in if(!c) vorkommt (billig) und recht selten in Zuweisungen..


Anmelden zum Antworten