Ошибка при использовании операторов сравнения в сочетании с макросами - PullRequest
1 голос
/ 10 ноября 2011
  • У меня есть два двумерных массива, которые закрываются и открываются
  • Я определил 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 <= Y <= Z не имеют своего математического значения </p>

Я полагаю, что препроцессор выполняет что-то вроде a<b<c замены, которая может объяснить предупреждение от компилятора.Как мне решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 10 ноября 2011

вместо этого используйте std :: max и std :: min

У ваших макросов есть побочные эффекты, которые вы используете.

1 голос
/ 10 ноября 2011

Макросы просто заменяют текст, поэтому вам нужно заключить все в скобки.

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

Если вы используете C ++, есть гораздо лучшие альтернативы.Встроенные функции имеют ту же производительность, что и макросы, но ведут себя намного лучше.

...