概述
zephyr里面有一个有意思的宏IS_ENABLED用于判断某个宏是否被定义,这里分析IS_ENABLED的实现方法,以了解其使用的局限性。
分析
宏定义代码如下:1
2
3
4
5#define IS_ENABLED(config_macro) _IS_ENABLED1(config_macro)
#define _IS_ENABLED1(config_macro) _IS_ENABLED2(_XXXX##config_macro)
#define _XXXX1 _YYYY,
#define _IS_ENABLED2(one_or_two_args) _IS_ENABLED3(one_or_two_args true, false)
#define _IS_ENABLED3(ignore_this, val, ...) val
enable实例
1 | #define CONFIG_SHELL_VT100_COLORS 1 |
最后 IS_ENABLED(CONFIG_SHELL_VT100_COLORS) 等价于 ture
disable实例
1 | #define CONFIG_SHELL_VT100_COLORS 0 |
其它值
1 | #define CONFIG_SHELL_VT100_COLORS 0 |
未定义
1 | IS_ENABLED(CONFIG_SHELL_VT100_COLORS) |
结论
从前面看,只有当判断的宏被定义为1才会转换为true,其它情况全是false。使用时应注意该局限。
从zephyr的代码看,IS_ENABLED只会用于bool型的CONFIG_XXX,也就是只能选择y,n的config。