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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage