Implementando min () e max () no Clang sem dupla avaliação

A versão clássica do pré-processador domin função parece

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

Isso deixa você aberto para uma avaliação dupla - a situação na qual você fazmin(f(), g())esquecendo quef oug Tem efeitos colaterais, e você tem que gastar horas tentando descobrir por que sua função está sendo executada duas vezes. Para evitar isso, você pode fazer

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

Isso funciona muito bem com o GCC, mas se você executar o Clang com-Wgnu conjunto - esse conjunto de advertências se enquadra-pedanticVocê recebe erros como

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

É possível definir essas macros de uma forma que impeça a dupla avaliaçãoe que é aceitável para Clang sob-pedantic? (Sim, você pode desativar o aviso com-Wno-gnu, nesse caso, o Clang manipula a expressão de instrução sem um problema. Estou perguntando porque eu, comoclang -pedanticSou muito exigente para o meu bem.)

Editar: Eu estou trabalhando em C. Eu marquei este C ++ também porque pensei que uma solução poderia ser aplicada a C ++, bem como a C. Oops - esqueceu-se de modelos! Desculpe pela ambigüidade.

questionAnswers(3)

yourAnswerToTheQuestion