Implementieren von min () und max () in Clang ohne doppelte Auswertung

8

Die klassische Präprozessorversion der Funktion min sieht wie

aus %Vor%

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

tun %Vor%

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

%Vor%

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.

    
bdesham 18.12.2013, 15:17
quelle

3 Antworten

12

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 .

    
Lightness Races in Orbit 18.12.2013, 15:19
quelle
6

Ich denke, das würde als C11-Lösung funktionieren.

%Vor%     
Simple 18.12.2013 16:22
quelle
3

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

    
Lundin 19.12.2013 12:32
quelle

Tags und Links