C - 检查NULL值

时间:2010-10-26 11:34:51

标签: c coding-style

我遇到过这样的情况:

if(x == NULL)
{
  printf(" The value of X is Null, exiting..");
  return -1;
}

并且这种“情况”会重复很多次......懒惰是否有更好的方式来写这个?

干杯!

5 个答案:

答案 0 :(得分:4)

继续你对@sbi的评论,是的,你可以用宏来做到这一点。

#define RETURN_MINUS_ONE_IF_NULL(x) \
do \
{\
    if (x == NULL) \
    { \
        printf(#x " is null, exiting\n"); \
        return -1; \
    } \
} \
while (0)

然后你会把它称为

signed int foo (int *x)
{ 
    RETURN_MINUS_ONE_IF_NULL(x);

    /* ... */
}

但是,我强烈建议不要这样做 - 隐藏宏中函数的返回对于一个随意的读者来说非常混乱。

答案 1 :(得分:1)

没有理由不能使用宏,尽管它应该比检查NULL指针更通用。

例如,

#define FAIL(condition,msg)if((condition)){fprintf(stderr,(msg));出口(1); }

然后你有,

失败(x == NULL,“无法实例化x”);

答案 2 :(得分:1)

如果根本没有发生这种情况,那么你就是在寻找断言的概念。

考虑C“assert(int expr)”函数。当“expr”等于0(expr为false,在布尔世界中)时,程序将退出并将(通常)打印断言失败的位置。

答案 3 :(得分:0)

如果您可以在指针为空时支持退出进程,则应使用断言函数:

void assert(int expression);

否则,宏是唯一可以处理此问题的方法。

答案 4 :(得分:0)

更好的写入方式是作为doxygen注释或您使用的任何文档系统中的条目,通知调用者他们应该知道的事情:NULL不是有效的指针。即使在那里,NULL无效的注释也不是特殊的,只需将参数x记录为类型foo的有效指针就更有意义了。这也涵盖了数十亿其他无效指针值。就个人而言,我宁愿不浪费时间记录每个函数的这个要求,而是将文档作为我的库接口的一般部分,除非为特定函数另有规定,否则所有指针参数必须是对应类型对象的有效指针。

如果你真的想在源级别对此进行记录,C99还是有办法,使用:

void foo(int x[static 1]);

而不是以下之一:

void foo(int *x);
void foo(int x[]);