网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
01月26日漏签0天
c语言吧 关注:801,829贴子:4,375,987
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 5回复贴,共1页
<<返回c语言吧
>0< 加载中...

求助请问这个max宏实现安全吗?

  • 只看楼主
  • 收藏

  • 回复
  • inc星际苍穹
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
实现如下——
#define __typecheck(x, y) \
(!!(sizeof((typeof(x)*)1 == (typeof(y)*)1)))
#define __is_constant(x) \
(sizeof(int) == sizeof(*(1 ? ((void*)((long)(x) * 0l)) : (int*)1)))
#define __no_side_effects(x, y) \
(__is_constant(x) && __is_constant(y))
#define __safe_cmp(x, y) \
(__typecheck(x, y) && __no_side_effects(x, y))
#define __cmp(x, y, op)((x) op (y) ? (x) : (y))
#define __cmp_once(x, y, op) ({\
typeof(x) __x = (x);\
typeof(y) __y = (y);\
__cmp(__x, __y, op); })
#define __careful_cmp(x, y, op)\
__builtin_choose_expr(__safe_cmp(x, y),\
__cmp(x, y, op), __cmp_once(x, y, op))
#define max(x, y)__careful_cmp(x, y, >)


  • inc星际苍穹
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#define max(x,y) ({typeof(x) _x=(x);typeof(y) _y=(y);(void)(&_x==&_y);_x>_y?_x:_y;})
这样呢?


2026-01-26 06:57:57
广告
不感兴趣
开通SVIP免广告
  • inc星际苍穹
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
__typecheck宏使用了强制类型转换,可能在某些情况下是不安全的,特别是当x或y的类型是复杂类型时,__is_constant宏使用了((void*)((long)(x) * 0l))这样的表达式,可能在某些编译器或优化级别下导致未定义行为。
如何设计才能更好避免呢


  • inc星际苍穹
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
__typecheck宏使用了强制类型转换,可能在某些情况下是不安全的,特别是当x或y的类型是复杂类型时,__is_constant宏使用了((void*)((long)(x) * 0l))这样的表达式,可能在某些编译器或优化级别下导致未定义行为。
该怎么设计比较好呢?@▫XeO2▫ @GTA小鸡


  • GTA小鸡
  • 吧主
    14
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
内核的max宏是为了解决常量表达式的问题才定义成这样,用户空间的程序完全没必要学习,2L的形式已经足够了


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 5回复贴,共1页
<<返回c语言吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示