这是什么意思? return func()

时间:2015-06-11 07:35:52

标签: c function return

在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声明,这是什么意思?我们可以返回一个函数吗?通常我们会返回一个值。

2 个答案:

答案 0 :(得分:2)

不,它没有返回功能本身。实际上是

  • 检查功能指针的非NULL值。

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

引用C11标准,第6.8.6.4章, return声明

  

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

答案 1 :(得分:2)

在C ++中,||运算符是短路运算符,这意味着,如果第一个参数为true,它甚至不会计算第二个,因为true || anything总是如此。

因此声明:

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

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

  • 如果函数指针为NULL,只需返回!NULL,即可1

  • 如果它为NULL,!pb->check_fb将评估为0,那么您必须调用该函数,并使用 it 返回,作为此函数的返回值。

所以它实际上与:

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

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

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

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

具有完全相同的返回值。