在没有双重评估的情况下在Clang中实现min()和max()

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下工作得很好,但是如果你通过-Wgnu设置的Clang运行它 – 这组警告属于-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 under -pedantic? (是的,你可以用-Wno-gnu禁用警告,在这种情况下,Clang处理语句表达没有问题.我问,因为我像clang -pedantic一样,对我自己的好处太挑剔了.)

编辑:我在C工作.我也标记了这个C,因为我认为解决方案可能适用于C以及C.哎呀 – 忘了模板!抱歉模棱两可.

最佳答案
如果您真的用C语言编写,只需不要使用预处理器:

template <typename T>
const T min(const T& a, const T& b)
{
   return (b < a) ? b : a;
}

(注意我已经交换了b和a,所以如果两者相等,你就得到左手操作数.)

否则no, not really.

转载注明原文:在没有双重评估的情况下在Clang中实现min()和max() - 代码日志