/*
* IS_ENABLED(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y' or 'm',
* 0 otherwise. Note that CONFIG_FOO=y results in "#define CONFIG_FOO 1" in
* autoconf.h, while CONFIG_FOO=m results in "#define CONFIG_FOO_MODULE 1".
*/
#define IS_ENABLED(option) __or(IS_BUILTIN(option), IS_MODULE(option))
这段内容解释了 Linux 内核中 IS_ENABLED(CONFIG_FOO) 宏的作用和实现逻辑,具体含义如下:
宏的功能IS_ENABLED(CONFIG_FOO) 是一个用于判断内核配置项 CONFIG_FOO 是否启用的宏,返回结果为:
1(真):如果 CONFIG_FOO 被配置为 y(直接编译进内核)或 m(编译为可加载模块)。0(假):如果 CONFIG_FOO 未被配置(即不启用)。背后的配置机制内核配置工具(如 kconfig)会根据用户配置生成 autoconf.h 头文件,其中:
CONFIG_FOO=y 时,autoconf.h 中会生成 #define CONFIG_FOO 1。CONFIG_FOO=m 时,autoconf.h 中会生成 #define CONFIG_FOO_MODULE 1(而非 CONFIG_FOO)。IS_ENABLED 宏通过检查这两种定义(CONFIG_FOO 或 CONFIG_FOO_MODULE 是否存在),统一判断配置项是否启用,无需区分 y 和 m 的细节。
使用场景 在内核代码中,常用于条件编译或运行时判断,例如:
if (IS_ENABLED(CONFIG_FOO)) {
// 当 CONFIG_FOO 为 y 或 m 时执行的代码
}
相比直接使用 #ifdef CONFIG_FOO,它能同时兼容 y(内置)和 m(模块)两种启用方式,更灵活。
简单说,这个宏的作用是“检查某配置项是否以任何形式(内置或模块)被启用”,简化了内核代码中对配置项状态的判断。