Реализация 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. Упс - забыл про шаблоны! Извините за двусмысленность.

Ответы на вопрос(3)

Ваш ответ на вопрос