gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:51:33 27 4
gpt4 key购买 nike

min 函数的经典预处理器版本看起来像

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

这让您面临双重评估——您执行 min(f(), g()) 的情况,而忘记了 fg 有副作用,您必须花费数小时来弄清楚为什么您的函数会运行两次。为了防止这种情况,您可以这样做

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

是否有可能以防止双重评估的方式定义这些宏,这在 -pedantic 下是 Clang 可接受的? (是的,您可以使用 -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;
}

(请注意,我已经交换了 ba,因此如果两者相等,您将获得左侧操作数。)

否则no, not really .

关于c - 在没有双重评估的情况下在 Clang 中实现 min() 和 max(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20661836/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com