【问题标题】:What is the point of invbool in C kernel programming?C内核编程中的invbool有什么意义?
【发布时间】:2021-04-20 19:17:12
【问题描述】:

我开始做更多的内核编程,在阅读中,发现invbool 的存在。但是,我似乎在互联网上找不到任何关于它的信息,除了记录在案的定义,在几个地方几乎逐字复制:

invbool 类型将值取反,使真值变为假,反之亦然。

考虑到这一点,我想不出这样可以减少代码混乱的例子。有没有一个很好的例子说明你什么时候会使用它?为什么它似乎只出现在内核编程文档中?

【问题讨论】:

标签: c linux-kernel boolean


【解决方案1】:

invbool 函数用于解析内核命令行和模块选项。 bool 版本解析用户可以设置为0/1N/Yoff/on 的选项,并相应地设置bool 标志。 invbool 版本将! 应用于结果,因此Y 映射到falseN 映射到true

据我所知,当程序员想要一个与用户配置参数相反的内部标志时,它们的唯一目的是为了方便或“清晰”。例如,从用户的角度来看,能够设置一个标志来禁用 foo 选项可能更有意义(因为它应该默认启用),但从内核程序员的角度来看,拥有一个简单的标志更方便表示是否启用了 foo。然后,您可以拥有一个名为disable_foo 的用户设置参数和一个名为foo_is_enabled 的内部布尔标志。当用户指定disable_foo=Y 时,您需要foo_is_enabled = false,因此您可以在此处使用invbool

您可以在aty128fb.c 中看到类似的情况:用户可以设置nomtrr 参数来禁用内存类型范围寄存器的使用,但程序员更喜欢有一个布尔变量mtrr,即@ 987654341@ 如果启用了 MTRR。

您可能认为这些是多余的,因为您可以只执行 mtrr = !parameter_bool("nomtrr"),但实际上 param_set_* 函数通过引用而不是按值返回参数值,因此您不能那么简单地扑通一声 !进入表达式。

我怀疑这个想法是定义这些函数使这些代码更“自我记录”。这当然值得商榷。

【讨论】:

  • 感谢您提到参数值是通过引用而不是按值传递的。我想知道你为什么不自己反转布尔值,这样有助于阐明这种疯狂
猜你喜欢
  • 2011-03-08
  • 1970-01-01
  • 2018-06-21
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多