我正在开发一个 C 程序。有一个函数需要两个指针参数,调用它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)
是我想要的最后一件事。我想要一个适用于所有情况的辅助宏。