kuriose Variablendeklaration



  • 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.



  • Das ist doch Treibercode, der wohl irgendwann mal im Linuxkernel landen soll.

    SeppJ schrieb:

    Es kann ja durchaus noch eine Variable gpio_desc im gleichen Scope geben.

    Und so ist es (höchstwahrscheinlich) auch.

    static struct gpio_desc gpio_desc[ARCH_NR_GPIOS];
    

    in drivers/gpio/gpiolib.c. In Treibern findet sich ahnliches. Vergleichbares wird der Samsung-Treiber wohl auch irgendwo stehen haben.


Anmelden zum Antworten