将比较运算符与宏结合使用时出错

时间:2011-11-10 03:56:06

标签: c++ macros c-preprocessor compiler-warnings

  • 我有两个2-D阵列关闭并打开
  • 我已将2个宏min(a,b)和max(a,b)定义为

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

我在我的代码中使用了一个表达式,如下所示:

max( close[i-1][ii], open[i-1][ii] ) < max( close[i-2][ii], open[i-2][ii] )

但是,这会返回以下警告:

  

警告:X&lt; = Y&lt; = Z之类的比较没有数学意义

我相信预处理器正在做某种事情 a<b<c 替换可能解释编译器的警告。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

使用std :: max和std :: min代替

您的宏会像使用它们一样产生副作用。

答案 1 :(得分:1)

宏只是替换文本,因此您需要将所有内容括起来。

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

如果您使用的是C ++,那么有更好的选择。内联函数具有与宏相同的性能,同时表现得更好。