C-检查空值
我遇到这样的情况:C-检查空值,c,coding-style,C,Coding Style,我遇到这样的情况: 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
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);
/* ... */
}
但是,我强烈建议不要这样做——在宏中隐藏函数的返回对于普通读者来说是非常混乱的。将您的评论转到@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);
/* ... */
}
但是,我强烈建议不要这样做-在宏中隐藏函数的返回对于普通读者来说非常混乱。没有理由不能使用宏,尽管它应该比检查空指针更通用 比如说, 如果条件{fprintfstderr,msg;exit1;} 那么你有,
FAILx==NULL,无法实例化x 没有理由不能使用宏,尽管它应该比检查空指针更通用 比如说, 如果条件{fprintfstderr,msg;exit1;} 那么你有,
FAILx==NULL,无法实例化x 如果这种情况根本不可能发生,那么您正在搜索断言的概念
考虑C断言expr函数。当expr等于0时,expr为false,在布尔世界中,程序将退出,并通常打印断言失败的位置。如果根本不打算发生这种情况,您将搜索断言的概念
考虑C断言expr函数。当expr等于0时,expr为false,在布尔世界中,程序将退出,并通常打印断言失败的位置。如果您支持在指针为null时退出进程,则应使用断言函数:
void assert(int expression);
否则,宏是处理此问题的唯一方法。如果您支持在指针为null时退出进程,则应使用assert函数:
void assert(int expression);
否则,很遗憾,宏是处理此问题的唯一方法。更好的编写方法是在您使用的任何文档系统中作为doxygen注释或条目,通知调用者他们应该已经知道的内容:NULL不是有效指针。即使在这里,也不必特别加上NULL无效的注释,更合理的做法是将参数x作为指向foo类型的有效指针记录下来。这也涵盖了数十亿其他无效指针值。就我个人而言,我不想浪费时间为每个函数记录这一需求,而是将其作为我的库接口的一般部分进行记录,除非为特定函数另有规定,否则所有指针参数必须是指向相应类型对象的有效指针 如果您真的想在源代码级别记录这一点,C99有一种方法,使用:
void foo(int x[static 1]);
而不是以下情况之一:
void foo(int *x);
void foo(int x[]);
更好的编写方法是在您使用的任何文档系统中使用doxygen注释或条目,通知调用者他们应该已经知道的事情:NULL不是有效的指针。即使在这里,也不必特别加上NULL无效的注释,更合理的做法是将参数x作为指向foo类型的有效指针记录下来。这也涵盖了数十亿其他无效指针值。就我个人而言,我不想浪费时间为每个函数记录这一需求,而是将其作为我的库接口的一般部分进行记录,除非为特定函数另有规定,否则所有指针参数必须是指向相应类型对象的有效指针 如果您真的想在源代码级别记录这一点,C99有一种方法,使用:
void foo(int x[static 1]);
而不是以下情况之一:
void foo(int *x);
void foo(int x[]);
上面的空值检查可以通过宏完成吗?是的,它可以用宏来完成,但这是不可取的。上面检查空值,可以通过宏来完成吗?是的,可以用宏来做,但是不可取。顺便说一句,assert也是宏。assert也是宏,顺便说一句。谢谢!不幸的是,我不能通过断言路线,正如你提到的。。。看起来太乱了:谢谢!不幸的是,我不能通过断言路线,正如你提到的。。。看起来太乱了: