繁体   English   中英

这是什么意思? 返回函数()

[英]What does this mean? return func()

在 Linux 内核源代码中,我找到了这个。

int         (*check_fb)(struct device *, struct fb_info *);
...
...
...
static int pwm_backlight_check_fb(struct backlight_device *bl,
                  struct fb_info *info)
{
    struct pwm_bl_data *pb = bl_get_data(bl);

    //something more

    return !pb->check_fb || pb->check_fb(pb->dev, info);
}

没看懂最后的return语句是什么意思? 我们可以返回一个函数吗? 通常我们返回一个值。

不,它本身不返回函数 它实际上是

  • 检查函数指针的非NULL值。

    • 如果不是NULL
      1. 使用函数指针调用函数
      2. 返回被调用函数的return值。
    • 如果为NULL
      1. 返回!NULL ( 1 )。

引用C11标准,第 6.8.6.4 章, return语句

如果执行带有表达式的return语句,则表达式的值将作为函数调用表达式的值返回给调用者。

在 C++ 中, || 运算符是一个短路运算符,这意味着,如果第一个参数为真,它甚至永远不会评估第二个参数,因为true || anything true || anything都是真实的。

因此声明:

return !pb->check_fb || pb->check_fb(pb->dev, info);

是一种检查非 NULL 函数指针并使用它来决定当前返回值的简短方法:

  • 如果函数指针为NULL ,只需返回!NULL ,它将为您提供1

  • 如果它不是NULL, !pb->check_fb将评估为0 ,因此您必须调用该函数,并使用返回的任何内容作为该函数的返回值。

所以它实际上等同于:

if (pb->check_fb == 0)
    return 1;
return pb->check_fb (pb->dev, info);

现在我说“有效”,但返回的实际可能与你看到的和我上面的最终代码片段略有不同。 但是,如果您将它们视为真/假值,效果是相同的。

从技术上讲,最后一行应该是:

return 0 || pb->check_fb (pb->dev, info);

具有完全相同的返回值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM