Как исправить эти макросы MIN, MAX? - PullRequest
0 голосов
/ 07 января 2012

Я получаю следующее предупреждение:

warning: left-hand operand of comma expression has no effect

Макросы определены ниже.Я компилирую с GCC (4.4.3) на Linux.Это код С.

#define MY_MAX(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a > _b ? _a : _b; })

#define MY_MIN(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a < _b ? _a : _b; })

Как мне исправить их, чтобы избавиться от предупреждений?

[[Обновить]]

На самом делеЯ нашел причину предупреждения.Это не имеет ничего общего с самим макросом.Это потому, что я пытался найти минимум двух чисел, одним из которых был #def с именем MAXIMUM_ARRAYSIZE.Он был определен как:

#define MAXIMUM_ARRAYSIZE (sizeof(size_t)==2,16384,1073741824)

Это довольно странное макроопределение.

Ответы [ 3 ]

1 голос
/ 07 января 2012

Ошибка не в вашем определении макроса.

Вам нужно будет показать нам код вызова для макросов MIN / MAX.Похоже, вы либо пытаетесь использовать результат MIN / MAX как неверный, либо передали токен (a или b), содержащий неожиданную запятую.

0 голосов
/ 07 января 2012

Я попробовал следующее, и все работало нормально без каких-либо предупреждений / ошибок с gcc -Wall. Проверьте, как вы используете эти макросы!

#include <stdio.h>

#define MY_MAX(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a > _b ? _a : _b; })

#define MY_MIN(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a < _b ? _a : _b; })

int main(void)
{
    printf("%d \n", MY_MAX(10,20));
    printf("%d \n", MY_MIN(10,20));
    return 0;
}

Выход:

$ gcc ma.c -Wall
$ ./a.out 
20 
10 
$ 
0 голосов
/ 07 января 2012

_a < _b ? _a : _b - это выражение, а не утверждение, но вы записали его как утверждение (само за ним следует точка с запятой).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...