Implementierung von min () und max () in Clang ohne doppelte Auswertung
Die klassische Präprozessor-Version dermin
Funktion sieht aus wie
#define min(a, b) ((a) < (b) ? (a) : (b))
Dies lässt Sie für eine doppelte Bewertung offen - die Situation, in der Sie dies tunmin(f(), g())
, das zu vergessenf
oderg
hat Nebenwirkungen, und Sie müssen Stunden damit verbringen, herauszufinden, warum Ihre Funktion zweimal ausgeführt wird. Um dies zu verhindern, können Sie dies tun
#define min(a, b) ({__typeof__(a) _a = (a); \
__typeof__(b) _b = (b); \
_a < _b ? _a : _b;})
Dies funktioniert unter GCC sehr gut, aber wenn Sie es mit Clang ausführen-Wgnu
set - Dieser Satz von Warnungen fällt unter den Dach von-pedantic
- Sie erhalten Fehler wie
test.c:5:10: error: use of GNU statement expression extension [-Werror,-Wgnu]
int a = min(3, 7);
^
test.c:1:22: note: expanded from macro 'min'
# define min(a, b) ({__typeof__(a) _a = (a); __typeof__(b) _b = (b); _a < _b ? _a : _b;})
Ist es möglich, diese Makros so zu definieren, dass eine doppelte Auswertung verhindert wird?und was für Clang akzeptabel ist-pedantic
? (Ja, Sie können die Warnung mit deaktivieren-Wno-gnu
In diesem Fall behandelt Clang den Anweisungsausdruck problemlos. Ich frage, weil ich magclang -pedantic
, bin zu wählerisch für mein eigenes Wohl.)
Bearbeiten: Ich arbeite in C. Ich habe dieses C ++ auch markiert, weil ich dachte, eine Lösung könnte sowohl für C ++ als auch für C gelten. Hoppla - Vorlagen vergessen! Entschuldigen Sie die Unklarheit.