我整个情况来像这样:Ç - 检查NULL值
if(x == NULL)
{
printf(" The value of X is Null, exiting..");
return -1;
}
这种“情况”被重复很多次.....懒惰一边是有没有更好的方式来写这个 ?
干杯!
我整个情况来像这样:Ç - 检查NULL值
if(x == NULL)
{
printf(" The value of X is Null, exiting..");
return -1;
}
这种“情况”被重复很多次.....懒惰一边是有没有更好的方式来写这个 ?
干杯!
继续评论@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);
/* ... */
}
,我会强烈建议不要这么做 - 隐藏在函数返回在宏是非常混乱的普通读者。
谢谢!不幸的是,我不能通过断言路线,这正如你所说...看起来太乱:) – 2010-10-26 15:16:19
没有理由不能使用宏,虽然它应该比检查NULL指针更普遍。
例如,
的#define FAIL(条件,MSG)如果((条件)){fprintf中(错误,(MSG));出口(1); }
然后你有,
FAIL(x == NULL, “无法实例X”);
在这种情况不意味着发生在所有,你正在寻找断言的概念。
考虑C“assert(int expr)”函数。当“expr”等于0(expr为false,在布尔世界中)时,程序将退出并将(通常)打印断言失败的位置。
如果你能支持退出进程时,指针为空,你应该使用断言功能:
void assert(int expression);
否则,宏是不幸的是处理这个问题的唯一途径。
顺便说一下'assert'也是一个宏。 – 2010-10-26 12:48:04
写这个的更好方法是将doxygen注释或条目用于任何文档系统中,通知调用者他们应该已经知道的东西:NULL
不是有效的指针。即使在那里,而不是特殊的 - NULL
无效的说法,只需将参数x
记录为foo
类型的有效指针就更有意义。这也覆盖了数十亿其他无效指针值。就个人而言,我宁愿不浪费时间记录每个函数的这个需求,而是将文档作为我的库接口的一个通用部分,除非为特定函数另外指定,否则所有指针参数都必须是指向相应类型的对象的有效指针。
如果你确实想在源代码级别也记录此,C99提供了一个方法,使用:
void foo(int x[static 1]);
,而不是执行下列操作之一:
void foo(int *x);
void foo(int x[]);
的上述检查NULL值,可以通过MACRO来完成吗?这是可取的... – 2010-10-26 11:39:41
是的,它可以用宏来完成,但这是不可取的。 – 2010-10-26 11:43:01