我遇到过这样的情况:
if(x == NULL)
{
printf(" The value of X is Null, exiting..");
return -1;
}
并且这种“情况”会重复很多次......懒惰是否有更好的方式来写这个?
干杯!
答案 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[]);