我开始做更多的内核编程,在阅读中,发现了invbool
的存在。但是,我似乎在互联网上找不到有关它的任何内容,除了记录在案的定义,在几个地方几乎逐字复制:
invbool 类型反转值,使真值变为假值,反之亦然。
考虑到这一点,我想不出这会减少代码混乱的情况。有没有一个很好的例子,你什么时候会使用它?为什么它似乎只出现在内核编程文档中?
invbool
函数用于解析内核命令行和模块选项。bool
版本解析用户可以设置为0/1
或N/Y
或off/on
的选项,并相应地设置bool
标志。invbool
版本对结果应用!
,因此Y
映射到false
,N
映射到true
。
据我所知,当程序员想要一个与用户的配置参数相反的内部标志时,它们的唯一目的是为了方便或"清晰"。 例如,从用户的角度来看,能够设置一个标志来禁用foo选项(因为它应该默认启用)可能更有意义,但从内核程序员的角度来看,拥有一个标志更方便简单地说明foo是否已启用。 然后,您可以拥有一个名为disable_foo
的用户设置参数和一个名为foo_is_enabled
的内部布尔标志。 您希望在用户指定disable_foo=Y
时foo_is_enabled = false
,因此您可以在此处使用invbool
。
你可以在aty128fb.c中看到这样的事情发生:用户可以设置nomtrr
参数来禁用内存类型范围寄存器,但程序员更喜欢有一个布尔变量mtrr
,如果启用了MTRR,则true
。
您可能认为这些是多余的,因为您可以只执行mtrr = !parameter_bool("nomtrr")
,但实际上param_set_*
函数通过引用而不是按值返回参数值,因此您不能轻易地将!
放入表达式中。
我怀疑这个想法是定义这些函数会使这样的代码更加"自我记录"。 这当然是值得商榷的。