免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: missjiang
打印 上一主题 下一主题

对min(a,b)这个宏的讨论 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-05-13 20:52 |只看该作者
原帖由 missjiang 于 2007-5-12 15:57 发表
template <class type>
type min(type a, type b)
{
     return a < b ? a : b;
}


c++中可没这么简单,这里的潜台词是a和b相应的构造函数存在,
如果不存在,这个模板就失败了。

所以己希望于在这里使用引用

  1. template <class type>
  2. type &min(type &a, type &b)
  3. {
  4.      return a < b ? a : b;
  5. }
复制代码


但是,还是不行。。。。。。。

论坛徽章:
0
12 [报告]
发表于 2007-05-13 21:03 |只看该作者
倒,是pp mm的发帖啊,早知道就不拍砖了

论坛徽章:
0
13 [报告]
发表于 2007-05-13 22:10 |只看该作者
原帖由 飞灰橙 于 2007-5-13 21:03 发表
倒,是pp mm的发帖啊,早知道就不拍砖了

我很喜欢这个抱着猫的小姑娘,但是我不是MM。

论坛徽章:
0
14 [报告]
发表于 2007-05-14 09:42 |只看该作者
顶,大家都是高手啊,楼主能提出这么好的话题,参与讨论的又能举一反三。佩服。能看到此帖,真是有幸!

论坛徽章:
0
15 [报告]
发表于 2007-05-14 09:45 |只看该作者
好贴,鉴定完毕

论坛徽章:
0
16 [报告]
发表于 2007-05-14 09:56 |只看该作者
为什么不用C++? min()和max()都可以写成函数模板,泛型的思想很好啊

论坛徽章:
0
17 [报告]
发表于 2007-05-22 20:38 |只看该作者
不错不错,写的很好,开眼见了,我要好好收藏。
使用传统的min导致上述程序出现问题的原因在于:x++被错误的执行了两次,这应该归结于宏的副作用,而与i++、++i的副作用无关。即使不使用i++、++i,宏min(a,b)执行时a、b之间的较小者被执行两次的副作用也是存在的,比如说:

CODE:
[Copy to clipboard]
int funcX()
{
   printf("This is func X\n";
   return 1;
}

int funcY()
{
   printf("This is func Y\n";
   return 2;
}

int main()
{
   min(funcX(), funcY());
}
程序执行时,"This is func X"被打印了两次,显然不是我们期望的。

这个例子举的很妙,
建议加精。

论坛徽章:
0
18 [报告]
发表于 2007-05-23 01:09 |只看该作者
have a look at the macro at linux kernel:



  1. /*
  2. * min()/max() macros that also do
  3. * strict type-checking.. See the
  4. * "unnecessary" pointer comparison.
  5. */
  6. #define min(x,y) ({ \
  7.         typeof(x) _x = (x);        \
  8.         typeof(y) _y = (y);        \
  9.         (void) (&_x == &_y);                \
  10.         _x < _y ? _x : _y; })

  11. #define max(x,y) ({ \
  12.         typeof(x) _x = (x);        \
  13.         typeof(y) _y = (y);        \
  14.         (void) (&_x == &_y);                \
  15.         _x > _y ? _x : _y; })

  16. /*
  17. * ..and if you can't take the strict
  18. * types, you can specify one yourself.
  19. *
  20. * Or not use min/max at all, of course.
  21. */
  22. #define min_t(type,x,y) \
  23.         ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; })
  24. #define max_t(type,x,y) \
  25.         ({ type __x = (x); type __y = (y); __x > __y ? __x: __y; })
复制代码

论坛徽章:
0
19 [报告]
发表于 2007-06-04 10:27 |只看该作者
搂主的帖子发的很不错,真的很收益,
能不用extension就不用这个建议很好,
一切简单化我是很同意的,所以针对这个问题的最佳解决办法是什么?
坚决不在min里面用表达式,并做到在min里用表达式是不合语法的意识,哈哈,这样就够时刻了!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP