根据C语言的语法:
1.在不同源文件中定义同名宏,该文件中只识别当前文件的宏。
2.在同一源文件中多次定义同名宏,则宏为最后一次定义的值。
一般第1种情况不会出现什么问题,因为该宏仅仅在自己的.c文件中被使用,但是第2种情况,若某个.c文件包含了2个头文件,这2个头文件都定义了同名的宏,那么这个.c文件将认最后一次包含定义的宏,这样可能并不是我们想要的结果。由于有时候头文件是层层嵌套包含的,一旦出现问题很难查到原因。
举例:
example1.h 中 #define MAX 10
example2.h 中 #define MAX 100
在main.c中
#include "example1.h"
#include "example2.h"
这样A=MAX;//MAX的值为100,因为example2.h后包含进来,而我们可能希望MAX=10,将造成逻辑错误。
针对以上问题,提出如下几点解决方案:
1.尽可能将宏名写长,写完全,并且跟文件名和作用域相关,避免宏名冲突
如 #define MAX 10 改为 #define _LCD_DRIVER_MAX 10
2.编译器会出现警告,严查所有重复宏警告
如若出现宏重复包含,keil的编译输出窗口会有 warning: #47-D: incompatible redefinition of macro "TEST_MARCO" (declared at line 72),说明TEST_MARCO重复定义了。 可以在编译输出窗口搜索incompatible redefinition关键字找出所有的重复包含宏。
3. 如果外部不需要宏,尽量减少在头文件中进行宏的定义