Die klassische Präprozessorversion der Funktion min
sieht wie
Dies lässt Sie für eine doppelte Bewertung offen - die Situation, in der Sie min(f(), g())
machen, vergessend, dass f
oder g
Nebenwirkungen hat und Sie Stunden damit verbringen müssen, herauszufinden, warum Ihre Funktion zweimal ausgeführt wird . Um dies zu verhindern, können Sie
Das funktioniert großartig unter GCC, aber wenn Sie Clang mit -Wgnu
set ausführen - diese Warnung fällt unter den Oberbegriff -pedantic
- Sie erhalten Fehler wie
Ist es möglich, diese Makros so zu definieren, dass die doppelte Bewertung und vermieden wird, die für Clang unter -pedantic
akzeptabel ist? (Ja, Sie können die Warnung mit -Wno-gnu
deaktivieren, in diesem Fall behandelt Clang den Anweisungsausdruck ohne ein Problem. Ich frage, weil ich, wie clang -pedantic
, zu wählerisch bin.)
Bearbeiten: Ich arbeite in C. Ich habe auch dieses C ++ getaggt, weil ich dachte, dass eine Lösung sowohl auf C ++ als auch auf C. anwendbar sein könnte. Entschuldigung für die Mehrdeutigkeit.
Wenn Sie wirklich in C ++ schreiben, verwenden Sie einfach nicht den Präprozessor :
%Vor% (Beachten Sie, dass ich b
und a
vertauscht habe, damit Sie den linken Operanden erhalten, wenn beide gleich sind.)
Sonst nein, nicht wirklich .
Die C11-Lösung von Simple sieht ideal aus, aber für den Fall, dass Sie keinen C11-Compiler haben, könnten Sie trotzdem ein Makro mit Intristiktyp-Sicherheit definieren (so sicher wie C irgendwie):
%Vor%Dieses Makro lässt nur die Implementierung von implementierten Typen zu, andernfalls erhalten Sie einen Compilerfehler.
Beispiel:
%Vor% Wenn Sie nun das obige Makro mit MIN(int, 1, 2)
ausführen, erhalten Sie einen Compilerfehler: " min_int
, keine solche Funktion existiert".