kuriose Variablendeklaration


  • Mod

    Nathan schrieb:

    Wobei mir ehrlich gesagt der Sinn in diesem Zusammenhang fehlt...

    Es wird ja hinterher ausgegeben. Da interessiert wahrscheinlich nur ob value == 0 war oder nicht. Da möchte man sich nicht sein Log mit dem genauen Wert vollmüllen.



  • Ach so.
    Gewissermaßen ein static_cast<bool>?


  • Mod

    Nathan schrieb:

    Ach so.
    Gewissermaßen ein static_cast<bool>?

    Ja.



  • SeppJ schrieb:

    Ich bin mir ziemlich sicher, dass es C ist. Nichts deutet auf C++. [...] könnte man mit C++ so viel schöner machen

    Was soll das C-Bashing? Ich finde den Code sehr lesbar und übersichtlich.

    static ssize_t gpio_value_show(struct device *dev,
            struct device_attribute *attr, char *buf)
    {
        const struct gpio_desc  *desc = dev_get_drvdata(dev);
        unsigned        gpio = desc - gpio_desc;
        ssize_t         status;
    
        mutex_lock(&sysfs_lock);
    
        if (!test_bit(FLAG_EXPORT, &desc->flags)) {
            status = -EIO;
        } else {
            int value;
    
            value = !!gpio_get_value_cansleep(gpio);
    
            if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
                value = !value;
    
            status = sprintf(buf, "%d\n", value);
        }
    
        mutex_unlock(&sysfs_lock);
        return status;
    }
    

    versus

    namespace
    {
      class gpio_value_show
      {
      public:
        gpio_value_show(device const& dev,
                        device_attribute const& attr)
          : dev(dev),
            attr(attr)
        {
        }
    
      private:
        device const& dev;
        device_attribute const& attr;
      };
    
      template <typename CharT>
      std::basic_ostream<CharT>&
      operator<<(std::basic_ostream<CharT>& os,
                 gpio_value_show const& gpio_value_show_dummy)
      {
        gpio_drvdata const& desc = gpio_value_show_dummy.dev.get_drvdata();
    
        std::lock_guard<type_of_sysfs_lock> yet_another_random_name(sysfs_lock);
    
        if (!(desc.get_flags() & FLAG_EXPORT))
        {
          if (os.exceptions() & std::ios_base::failbit)
            throw invalid_io_exception("FLAG_EXPORT");
          else
            os.setstate(std::ios_base::failbit)
        }
        else
        {
          std::size_t gpio = desc - gpio_desc;
          bool value = static_cast<bool>(gpio_get_value_cansleep(gpio));
    
          if (desc.get_flags() & FLAG_ACTIVE_LOW)
          {
            value = !value;
          }
    
          // ?: needed because of the boolalpha flag
          os << (value ? CharT('1') : CharT('0')) << CharT('\n');
        }
    
        return os;
      }
    }
    

    Der C Code ist schnell und es ist klar, was er macht.

    Der C++ Code ist (wie jeder C++ Code) überladen mit vermeintlich "höherer Abstraktion". Jedenfalls muss man erst einmal suchen, was da genau passiert. Die Hälfte ist Boilerplate und meistens ist Boilerplate und Code gemischt. Ausserdem bin ich sicher, dass das Binary um ein Vielfaches grösser ist. Und in der Ausführung um ein Vielfaches langsamer.



  • @unbash
    Dein Vergleich ist unsinnig.
    Man könnte auch schönen C++ Code schreiben.



  • SeppJ schrieb:

    Das !!foo ist wohl eine trickreiche (und evtl. schnellere) Schreibweise für foo ? 1 : 0 . Außerdem eine weitere Stelle, die man in C++ viel schöner mittels bool hätte lösen können.

    Wenn du damit static_cast<bool> meinst, das geht zwar, wird aber von MSVC mit einer sinnfreien "Performance-Warning" quittiert.
    Bei !! dagegen kommt keine.

    Und schneller ist da auch nix, ausser schneller zu tippen 🤡



  • Seit wann schreibt man nicht mehr was man meint, in dem Fall foo != 0 ?



  • Seit dem man nicht mehr if (FunktionDieBoolZurueckgibt() != false) schreibt...



  • Kind, Badewasser.


  • Mod

    Bashar schrieb:

    Seit wann schreibt man nicht mehr was man meint, in dem Fall foo != 0 ?

    Dann stünde da

    int value = funktionaufruf() != 0;
    

    Da finde ich ehrlich gesagt !! doch besser.

    hustbaer schrieb:

    SeppJ schrieb:

    Das !!foo ist wohl eine trickreiche (und evtl. schnellere) Schreibweise für foo ? 1 : 0 . Außerdem eine weitere Stelle, die man in C++ viel schöner mittels bool hätte lösen können.

    Wenn du damit static_cast<bool> meinst, das geht zwar, wird aber von MSVC mit einer sinnfreien "Performance-Warning" quittiert.
    Bei !! dagegen kommt keine.

    Ich dachte an

    bool value = funktionsaufruf();
    


  • SeppJ schrieb:

    hustbaer schrieb:

    SeppJ schrieb:

    Das !!foo ist wohl eine trickreiche (und evtl. schnellere) Schreibweise für foo ? 1 : 0 . Außerdem eine weitere Stelle, die man in C++ viel schöner mittels bool hätte lösen können.

    Wenn du damit static_cast<bool> meinst, das geht zwar, wird aber von MSVC mit einer sinnfreien "Performance-Warning" quittiert.
    Bei !! dagegen kommt keine.

    Ich dachte an

    bool value = funktionsaufruf();
    

    Jo das wäre schön, nen?
    Kommt aber leider die selbe blöde Warning 🙂
    Es sei denn natürlich man dreht sie ab.
    http://stackoverflow.com/questions/2439494/forcing-value-to-boolean-bool-makes-warning-doesnt



  • Bashar schrieb:

    Kind, Badewasser.

    Ne.


  • Mod

    hustbaer schrieb:

    Jo das wäre schön, nen?
    Kommt aber leider die selbe blöde Warning 🙂
    Es sei denn natürlich man dreht sie ab.
    http://stackoverflow.com/questions/2439494/forcing-value-to-boolean-bool-makes-warning-doesnt

    😕 Ist die Warnung berechtigt oder ist das, nichts für ungut, wieder irgendwelcher MSVC Quatsch?



  • irgendwie hab ich das Gefühl dass hier aneinander vorbeigeredet wird

    ging es bei !!foo nicht darum dass foo ein Objekt ist, dessen operator! überschrieben wurde und über die Lösung dass das erste ! in !!foo der oprator ausgeführt und das Ergebnis durch das zweite ! schlicht negiert wird ?

    krass was manche Kleinigkeiten(im Sinne von 2 Ausrufezeichen, ich will nicht sagen es sei unwichtig) doch für Diskussionen auslösen, tut mir leid 🙂


  • Mod

    Ceos schrieb:

    ging es bei !!foo nicht darum dass foo ein Objekt ist, dessen operator! überschrieben wurde und über die Lösung dass das erste ! in !!foo der oprator ausgeführt und das Ergebnis durch das zweite ! schlicht negiert wird ?

    Da das ziemlich eindeutig C ist, ist foo hier weder ein Objekt, noch ist der operator! überladen. ! ist hier der normale NOT-Operator. Du musst jedoch beachten, dass !!foo != foo . Ich habe das Gefühl, das ist dir irgendwie entgangen. Beispiel:

    int foo = 5;
    !foo;   // 0
    !!foo;  // 1
    


  • Bashar schrieb:

    Seit wann schreibt man nicht mehr was man meint, in dem Fall foo != 0 ?

    Ja, sehe ich auch so.



  • SeppJ schrieb:

    Außerdem eine weitere Stelle, die man in C++ viel schöner mittels bool hätte lösen können.

    In C99 gibt es auch bool. Viel schöner ist auch relativ. "Viel schöner" kann man also auch in C schreiben und braucht deswegen nicht auf C++ ausweichen.



  • SeppJ schrieb:

    Das !!foo ist wohl eine trickreiche (und evtl. schnellere) Schreibweise für foo ? 1 : 0 .

    Naja, trickreich ist wohl übertrieben, !!ausdruck ist einfach ein Äquivalent für

    (ausdruck == 0)==0 oder passender wohl 0==(0==ausdruck))
    

    und das wiederum ist äquivalent zu

    ausdruck != 0
    


  • SeppJ schrieb:

    int value = funktionaufruf() != 0;
    

    Da finde ich ehrlich gesagt !! doch besser.

    Ich nicht.


  • Mod

    Wutz schrieb:

    In C99 gibt es auch bool.

    Dem Rest des Codes nach zu urteilen ist das C89.


Anmelden zum Antworten