通常,我们可以使用#ifdef FOO 或者 #ifndef FOO 及其等价写法[如#if defined(FOO)]来判断一个宏(这里是 FOO)是否被定义。但有时候,我们编写代码时可能误用#if FOO 这种写法来判断一个宏是否被定义。此时,预处理器会假定这个宏的值为 0,但这很可能导致条件编译无法得到预期的处理。针对此种情况,预处理器会产生这一警告。为了避免麻烦,某些项目的管理者可能会通过编码规范来限定用于测试宏的方法,比如始终使用下面的条件编译写法:
#if defined(FOO) && FOO /* Block A */ #else /* Block B */ #endif
由于不属于高危警告,因此-Wundef 警告不会被-wall 或-Wextra 选项打开,除非显式指定-Wundef 选项。当遇到-Wundef 警告时,务必仔细检查预处理指令中宏的测试条件,并采用正确的方法来测试宏,以便达到预期目的。
在Keil中的实现方式也非常简单,只需要在Misc Controls文本框里填写"-Wundef"即可。如下图所示:

我要赚赏金
