【问题标题】:Efficient way of checking multiple function arguments for NULL in C在 C 中检查 NULL 的多个函数参数的有效方法
【发布时间】:2020-12-18 12:18:32
【问题描述】:

我只是想知道是否有更有效的方法来检查传递给函数的任何参数是否包含 NULL 指针? 到目前为止,这是我一直用作参数检查的内容。如果任何输入为 NULL,我希望函数返回 -1。

int Func(const char *one, const char *two){

    if( !one || !two ){
        return -1;
    }

    //rest of the function code
}

这对于接受两个参数的函数来说很好;但是,如果我有一个接收三个或更多参数的函数,它看起来很乱。有没有更好的方法?

【问题讨论】:

  • 就这么做吧。我曾在超高性能代码中工作过,我们需要像这样优化测试,并且通过依赖特定 C 实现的某些属性并将指针按位或一起完成一些优化,这样只有一个测试和分支有必要的。但在特殊情况之外,这是不值得的。以正常方式编写测试,让编译器完成它的工作。
  • “看起来不错”。可以应用相反的:if(!(a && b && ..)) return -1;,如果这更适合您的喜好。分别使用|& 可能会有一些争论,尽管我会坚持使用逻辑运算符,因为它(实际上)不会产生影响......并且取决于编译器和输入。跨度>
  • @user2864740 位运算符有问题。您必须将指针转换为整数才能使用它们。即使是整数,& 也无法处理两个非空指针没有共同位的情况。
  • 啊,真的。大脑在& 上哎呀。我会坚持使用逻辑运算符。
  • PS 我心想。你真的需要逆运算符吗?怎么样:if (a && b && nth) {/* your code */} else {return -1;}

标签: c function null parameter-passing return-value


【解决方案1】:

您可以为此编写宏。以 5 个参数为例:

#define EVAL(a, ...)!(a) || EVAL1(__VA_ARGS__)
#define EVAL1(a, ...)!(a) || EVAL2(__VA_ARGS__)
#define EVAL2(a, ...)!(a) || EVAL3(__VA_ARGS__)
#define EVAL3(a, ...)!(a) || EVAL4(__VA_ARGS__)
#define EVAL4(a, ...)!(a) 

#define MYASSERT5(...) EVAL(__VA_ARGS__)

int myfunc(const char *p1, const char *p2, const char *p3, const char *p4, const char *p5)
{
    if(MYASSERT5(p1,p2,p3,p4,p5)) return -1;
}

【讨论】:

  • 宏的好处是您可以使用它们来嵌入调试调用,这些调用会发出函数名、文件和行号。 出现错误时,找出程序错误的最简单方法是让它在日志中告诉您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 2012-12-05
  • 2020-12-27
  • 2013-11-21
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
相关资源
最近更新 更多