这是我目前对为什么人们会选择使用其中一种而不是另一种的理解,您能确认或更正我吗?
- 运行时与编译时:如果您不知道是否要在运行时启用此功能,请使用三态。否则,你在编译时就知道了,所以使用 bool。如果你
#ifdef
在一些周围的代码 B 中包含一些可选代码 A(例如,包括 GPU 支持等额外功能),那么你需要将 A 设置为 bool,即使整个模块 B 可以声明为三态,因为ifdef
在编译时进行评估。 - 迭代速度:如果您正在开发一段新的代码,那么如果您将其声明为模块,那么您可以快速卸载旧版本并重新加载新编译的版本,而无需重新启动整个系统。
- 侵入性:有些代码动态添加到已经运行的内核(例如对称多处理)会具有破坏性,因此它始终为布尔值。
我在这里还缺少其他因素吗?我认为自己错过的因素可能是
- 表现
- 安全
- 经验法则(例如“始终使用 bool 除非您需要使用三态”)
其他解释、注释、链接和想法将不胜感激。谢谢!
答案1
引文来自https://www.linuxjournal.com/content/kbuild-linux-kernel-build-system
并非内核中的所有内容都可以编译为模块。
许多功能非常具有侵入性,您必须在编译时决定内核是否支持它们。例如,您无法向正在运行的内核添加对称多处理 (SMP) 或内核抢占支持。因此,使用布尔配置符号对于这些类型的功能是有意义的。
大多数可以编译为模块的功能也可以在编译时添加到内核中。这就是三态符号存在的原因——决定是否要编译内置功能 (y)、作为模块 (m) 或根本不编译 (n)。
我认为这一点很明确:如果只有两个选择,则使用布尔值,如果有三个选择,则使用三态。其他一切都没有意义。