2010-10-26 60 views
1

我整个情况来像这样:Ç - 检查NULL值

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

这种“情况”被重复很多次.....懒惰一边是有没有更好的方式来写这个 ?

干杯!

+1

的上述检查NULL值,可以通过MACRO来完成吗?这是可取的... – 2010-10-26 11:39:41

+0

是的,它可以用宏来完成,但这是不可取的。 – 2010-10-26 11:43:01

回答

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); 

    /* ... */ 
} 

,我会强烈建议不要这么做 - 隐藏在函数返回在宏是非常混乱的普通读者。

+0

谢谢!不幸的是,我不能通过断言路线,这正如你所说...看起来太乱:) – 2010-10-26 15:16:19

1

没有理由不能使用宏,虽然它应该比检查NULL指针更普遍。

例如,

的#define FAIL(条件,MSG)如果((条件)){fprintf中(错误,(MSG));出口(1); }

然后你有,

FAIL(x == NULL, “无法实例X”);

1

在这种情况不意味着发生在所有,你正在寻找断言的概念。

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

0

如果你能支持退出进程时,指针为空,你应该使用断言功能:

void assert(int expression); 

否则,宏是不幸的是处理这个问题的唯一途径。

+1

顺便说一下'assert'也是一个宏。 – 2010-10-26 12:48:04

0

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

如果你确实想在源代码级别也记录此,C99提供了一个方法,使用:

void foo(int x[static 1]); 

,而不是执行下列操作之一:

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