Я работаю над программой на Си. Есть функция, которая принимает два аргумента-указателя, называем ее cmp()
. Я представляю здесь упрощенную замену cmp()
для наглядности:
int cmp(struct foo *a, struct foo *b)
{
return a->bar == b->bar;
}
Я хотел бы сделать макрос с проверкой NULL, например:
#define SAFE_CMP(a,b) (((a) != NULL && (b) != NULL) ? cmp((a),(b)) : 0)
Я думаю, что это прекрасно. Однако при компиляции с -Wall
и переключателем компиляции, который рассматривает предупреждение как ошибку, следующий код вызывает проблемы:
int baz(struct foo *a)
{
struct foo b;
/* ... */
return SAFE_CMP(a, &b);
}
, поскольку gcc предупреждает, что "адрес b никогда не будет равен NULL" .
Есть ли способ обойти эту ситуацию?
Наличие различных вспомогательных макросов, таких как SAFE_CMP_1(safe_arg,unsafe_arg)
, SAFE_CMP_2(unsafe_arg,safe_arg)
и т. Д., Последнее, что я хочу. Я хотел бы иметь один вспомогательный макрос, применимый ко всем ситуациям.