Implementacja min () i max () w Clang bez podwójnej oceny

Klasyczna wersja preprocesoramin funkcja wygląda

#define min(a, b) ((a) < (b) ? (a) : (b))

Pozostawia to cię do podwójnej oceny - sytuacji, w której to robiszmin(f(), g()), zapominając o tymf lubg ma skutki uboczne i musisz spędzić wiele godzin próbując zrozumieć, dlaczego twoja funkcja działa dwukrotnie. Aby temu zapobiec, możesz to zrobić

#define min(a, b) ({__typeof__(a) _a = (a); \
    __typeof__(b) _b = (b); \
    _a < _b ? _a : _b;})

Działa to świetnie w GCC, ale jeśli uruchomisz go za pomocą Clang-Wgnu set - ten zestaw ostrzeżeń należy do kategorii-pedantic— Masz takie błędy jak

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;})

Czy możliwe jest zdefiniowanie tych makr w sposób uniemożliwiający podwójną ocenęi co jest do przyjęcia dla Clanga-pedantic? (Tak, możesz wyłączyć ostrzeżenie za pomocą-Wno-gnuW takim przypadku Clang obsługuje wyrażenie instrukcji bez problemu. Pytam, bo ja lubięclang -pedantic, jestem zbyt wybredna dla mojego dobra.)

Edytować: Pracuję w C. Oznaczyłem również tego C ++, ponieważ uważałem, że rozwiązanie może dotyczyć zarówno C ++, jak i C. Oops - zapomniałem o szablonach! Przepraszam za niejednoznaczność.

questionAnswers(3)

yourAnswerToTheQuestion