Реализация min () и max () в Clang без двойной оценки
Классическая препроцессорная версияmin
функция выглядит
#define min(a, b) ((a) < (b) ? (a) : (b))
Это оставляет вас открытыми для двойной оценки - ситуации, в которой вы делаетеmin(f(), g())
забыв об этомf
или жеg
имеет побочные эффекты, и вам придется часами пытаться выяснить, почему ваша функция работает дважды. Чтобы предотвратить это, вы можете сделать
#define min(a, b) ({__typeof__(a) _a = (a); \
__typeof__(b) _b = (b); \
_a < _b ? _a : _b;})
Это прекрасно работает под GCC, но если вы запускаете его через Clang с-Wgnu
набор - этот набор предупреждений подпадает под эгидой-pedantic
- вы получаете ошибки вроде
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;})
Можно ли определить эти макросы таким образом, чтобы предотвратить двойную оценкуа также что приемлемо для Clang под-pedantic
? (Да, вы можете отключить предупреждение с помощью-Wno-gnu
, в этом случае Clang обрабатывает выражение оператора без проблем. Я спрашиваю, потому что я, какclang -pedantic
Я слишком разборчив для моего блага.)
Редактировать: Я работаю в C. Я тоже пометил этот C ++, потому что подумал, что решение может быть применимо как к C ++, так и к C. Упс - забыл про шаблоны! Извините за двусмысленность.