kuriose Variablendeklaration
-
der OP schrieb:
stammt aus dem Exynos GPIO driver
Man sieht aber auch ohne diese Information, dass das kein Wegwerfbeispiel mit Tippfehler sein kann.
-
ich muss gestehen dass die 2 Zeilen vll. auch ein klein wenig aus dem Zusammenhang gerissen wurden und ich mir nicht mal sicher bin ob es sich um reines C oder doch C++ handelt. Aber da ich im Moment eher am Kontext interssiert bin und dieser kleine Stolperstein mir gestern eine Stunde lang den Nerv geraubt hat dachte ich man fragt lieber einmal die Spezialisten als dumm zu sterben.
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); //<--- an der Stelle würde ich behaupten es ist C++ // "!!" in der kombi kenn ich nur als "missbrauch" des operator! um ein objekt als negiertes "nicht" zu bool zu konvertieren if (test_bit(FLAG_ACTIVE_LOW, &desc->flags)) value = !value; status = sprintf(buf, "%d\n", value); } mutex_unlock(&sysfs_lock); return status; }
DAs ist jetzt nur die Methode der Vollständigkeit halber, für mich ist das Thema soweit erledigt, aber ihr dürft gern ncoh angeregt diskutieren
-
Ich bin mir ziemlich sicher, dass es C ist. Nichts deutet auf C++. Viele Stellen (z.B. den "scoped" Mutex) könnte man mit C++ so viel schöner machen, das muss einen Grund haben, warum das nicht benutzt wird.
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.
-
ich habs nicht geschrieben XD
ich würde es wahrscheinlich viel umständlicher machen ... in C fehlt mir ein wenig die Praxis, ich hab sonst immer für Atmel µController mit C programmiert aber sonst mich eher auf .NET oder Java beschränkt ... Anwendungen schreiben sich mit nem guten Framework einfach schneller und aufm µC wirds spätestens bei Interrupts und inline assembler unschön also muss man es nicht elegant machen es muss nur schnell sein.
-
Schnell und elegant schließt sich nicht aus. Das war sogar die Hauptmotivation bei der Erfindung von C++.
Trotzdem ist das reines C und für reines C auch ganz ok. Ich hätte wahrscheinlich ein paar Sachen anders gemacht, aber vielleicht hatte der Autor gute Gründe, die mir nicht bekannt sind.
-
SeppJ schrieb:
Das
!!foo
ist wohl eine trickreiche (und evtl. schnellere) Schreibweise für**foo ? 1 : 0
**kannst du das bitte nochmal kurz erläutern? foo ? 1 : 0
-
Länger ausgeschrieben:
int value; if (foo) value = 1; else value = 0;
Wobei mir ehrlich gesagt der Sinn in diesem Zusammenhang fehlt...
-
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?