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-gnu
W 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ść.