Ich suchte nach einem Makro, das dem Mit-Konstrukt ähneln wird. Die Nutzung sollte so etwas wie:"mit" Makro in C
with (lock(&x), unlock(&x)) {
...
}
Es könnte für einige andere Zwecke nützlich sein.
kam ich mit diesem Makro auf:
#define __with(_onenter, _onexit, v) \
for (int __with_uniq##v=1; __with_uniq##v > 0;)\
for (_onenter; __with_uniq##v > 0; _onexit) \
while (__with_uniq##v-- > 0)
#define _with(x, y, z) __with(x, y, z)
#define with(_onenter, _onexit) _with(_onenter, _onexit, __COUNTER__)
Es verfügt über 3 verschachtelte Schleifen, weil es sollte:
- initialisieren Schleifenzähler (C99 nur, natürlich)
- Möglicherweise variable _onenter initialisieren (wie
with (int fd=open(..), close(fd))
) - Erlaube
break
innerhalb des Codeblocks. (continue
ist auch erlaubt. Und das Makroassert()
es angepasst werden kann)
ich es für die XV6 OS auf den Code verwendet, und es scheint ziemlich nützlich.
Meine Frage ist - was sind die schlimmsten Probleme mit einem solchen Makro? Ich meine, neben der bloßen Verwendung eines C-Makros (insbesondere eines, das ein neues Kontrollfluss-Konstrukt implementiert).
Bisher haben diese Nachteile/Probleme gefunden:
- Keine Unterstützung für
return
odergoto
(aber es kann einigegoto
s im Kernel-Code speichern) - Keine Unterstützung für Fehler (wie
fd < 0
). Ich denke, das ist reparierbar. - gnu89/c99 und darüber nur (Schleifenzähler. Der einzigartige variable Trick ist nicht notwendig)
- Etwas weniger effizient als einfach sperren-entsperren. Ich halte es für unbedeutend.
Gibt es noch andere Probleme? Gibt es eine bessere Möglichkeit, ein ähnliches Konstrukt in C zu implementieren?
Oh. Antwort endlich ... Danke, ich wusste nicht über 'Aufräumen' - klingt sinnvoll. Hat das Makro mehr spezifische Probleme, abgesehen von seiner Schärfe? – Elazar
Die fehlende Unterstützung für "return" scheint ein Deal-Breaker zu sein, es sei denn, Sie arbeiten mit einem strengen Codierungsstandard gegen "return" -Anweisungen mitten in Funktionen. Eine "Rückkehr" in einem "mit" -Block würde unscheinbar aussehen, würde aber zur Laufzeit verheerend wirken. – pdw
Ich verstehe, und stimme zu, dass "Rückkehr" ein großes Problem ist (so ist "Aufräumen" viel besser). Aber braucht 'goto' keinen gleichermaßen strengen Kodierungsstandard? Was sind die Vorteile von goto in dieser Hinsicht? – Elazar