Linux kernel 为什么为debugfsapi检查-ENODEV是不明智的

Linux kernel 为什么为debugfsapi检查-ENODEV是不明智的,linux-kernel,Linux Kernel,debugfsapi如是说 如果内核中未启用debugfs,那么将返回值-ENODEV。检查此值不是明智之举,而是检查NULL或!改为NULL,以消除调用代码中对#ifdef的需要 但为什么不明智呢?你能给我举一些例子说明在调用代码中不需要ifdef吗?是的。那个建议毫无意义。如果未启用CONFIG_DEBUG_FS,则返回值-ENODEV(强制转换为指针)。这显然不是NULL,但也不能用作有效指针 最好在返回值上使用IS_ERR_或_NULL(ptr)。如果未定义CONFIG_DEBUG_FS

debugfsapi如是说

如果内核中未启用debugfs,那么将返回值-ENODEV。检查此值不是明智之举,而是检查NULL或!改为NULL,以消除调用代码中对#ifdef的需要


但为什么不明智呢?你能给我举一些例子说明在调用代码中不需要ifdef吗?

是的。那个建议毫无意义。如果未启用CONFIG_DEBUG_FS,则返回值-ENODEV(强制转换为指针)。这显然不是NULL,但也不能用作有效指针


最好在返回值上使用IS_ERR_或_NULL(ptr)。如果未定义CONFIG_DEBUG_FS,则将捕获-ENODEV返回。如果定义了CONFIG_DEBUG_FS,但调用失败,则返回NULL。这种方法可以处理任何一种可能性。

人们可能会将-ENODEV解释为成功,直到对dentry执行操作时返回了一些内容,除了删除它(debugfs\u remove)并将其用作另一个文件(debugfs\u create\u-family)的目录之外。当禁用CONFIG_DEBUG_FS时,所有这些函数都会正确处理案例

这就是为什么它只适用于检查NULL或NULL!空

在极少数情况下,当明确引用debugfs_create_*()返回的dentry时(例如,为了访问inode的私有数据),只需检查第一个这样的调用是否没有返回-ENODEV就足够了。

您询问: “您能给我一些关于在调用代码中不需要#ifdef的例子吗?”

编写代码的一种方法是:

#ifdef CONFIG_DEBUG_FS
  < ... do your debugfs stuff ... >
#endif
#ifdef CONFIG_DEBUG_FS
< ... 做你的调试工作…>
#恩迪夫
我猜这就是文档的意思

许多内核开发人员认为在代码中放置太多的<>代码> IFIFF -α} /代码>对是丑陋的(“毛茸茸的”)…p> 内核编码风格文档中的相关代码段: 更喜欢编译出整个函数,而不是函数或函数的一部分 表达式的一部分。与其在表达式中放置ifdef,不如使用factor 将部分或全部表达式输出到单独的辅助函数中,并应用 以该功能为条件。”


有鉴于此,按照it的建议,如果您不想使用#ifdef,那么请使用已经发布的答案。

让我困惑的是为什么要检查NULL或!NULL与消除#ifdef相关。我可能解释不清楚。还是谢谢你。