kuriose Variablendeklaration
-
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>?
-
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ürfoo ? 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.
-
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ürfoo ? 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ürfoo ? 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.
-
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-doesntIst 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
-
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ürfoo ? 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.
-
Wutz schrieb:
In C99 gibt es auch bool.
Dem Rest des Codes nach zu urteilen ist das C89.