【问题标题】:What does this mean? return func()这是什么意思?返回函数()
【发布时间】:2015-06-11 07:35:52
【问题描述】:

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

【问题讨论】:

  • 你可能应该学习一些基本的 C。这是非常基础的东西,每次你不明白的地方问一个问题来学习会非常低效。
  • pb->check_fb(pb->dev, info); 是一个函数调用。

标签: c function return


【解决方案1】:

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

因此声明:

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

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

  • 如果函数指针是NULL,只需返回!NULL,它就会给你1

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

所以它实际上与:

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

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

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

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

具有完全相同的返回值。

【讨论】:

  • 只是为了使其完美,which will give you a truth value...即1,(根据 §6.5.3.3,第 5 段)
【解决方案2】:

不,它本身并没有返回 函数。其实是

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2014-10-31
    • 2018-06-09
    • 1970-01-01
    相关资源
    最近更新 更多