在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
声明,这是什么意思?我们可以返回一个函数吗?通常我们会返回一个值。
答案 0 :(得分:2)
不,它没有返回功能本身。实际上是
NULL
值。NULL
return
值。NULL
!NULL
(1
)。引用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);
具有完全相同的返回值。