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-pedantic
Você 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 -pedantic
Sou 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.