今天在修复LPC32XX系列内核源代码的一个缺陷的时候,遇到一个问题——如何判断某个宏是否已经定义。

以前常用的方法就是直接使用

但是看了看别的内核源代码,发现有一种用法更常见:

于是分析了一下这两种方式的优劣。首先是最基本的判断MACRO_NAME是否定义的功能,两者都具备而且都没有什么问题。差别就是一个少几个字母,另一个多几个。但是根据这位兄弟的分析,似乎多写几个字母更有好处,因为这样依赖条件编译的条件,就不光是宏,而是宏表达式了。

用个例子来说,如果某段代码需要在宏MACRO_A和宏MACRO_B都定义的情况下才生效,两种方法的实现如下:

另一种方式:

看上去后一种似乎可读性更好。