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也是宏,顺便说一句。谢谢!不幸的是,我不能通过断言路线,正如你提到的。。。看起来太乱了:谢谢!不幸的是,我不能通过断言路线,正如你提到的。。。看起来太乱了: