有两个不同的文件A.h与B.h。这两个文件中都定义了一个名为Function的函数。现在要同时使用这两个文件,于是包含了这两个文件,但是编译会出错,因为Function重定义。
但是A.h与B.h是不能修改的,这两个文件又都是必须用到的。
解决方法如下:
#define Function FunctionT
#include "A.h"
#undef Function
#include "B.h"
其详细含义为:
#define Function FunctionT //首先为Function定义一个别名FunctionT
#include "A.h" //包含A.h。于是会按照上面的别名FunctionT来对A.h中的函数Function进行编译。这样A.h中的函数Function就被修改为FunctionT
#undef Function //将的FunctionT宏别名释放掉
#include "B.h" //包含B.h。由于已经释放掉了Function释的宏定义,所以对B.h中的函数Function依然会按Function来编译
在这个过程中,编译A.h的时候,因为宏定义的原因,会将A.h中的Function函数按照FunctionT这个函数名来编译。然后释放了宏定义,于是FunctionT这个别名就不再存在了。当编译B.h的时候,会依然用Function这个函数名来编译B.h。
编译通过后,若调用Function函数,只能是调用B.h的Function函数。A.h中的Function函数已经不能使用了,而由于FunctionT也不存在了,所以调FunctionT也是不可以的。
也就是说,该写法是将A.h中的Function屏蔽掉,只可以使用B.h中的Function。
要达到该目的,还可以使用如下写法:
#include "A.h"
#define Function FunctionT
#include "B.h"
该写法同样
将
A.h
中的
Function
屏蔽掉了。因为无论调用Function还是FunctionT,都会因为宏的原因被解析为FunctionT。而FunctionT是
B.h的函数。
若希望A.h与B.h中的Function可以同时使用,那么可以对A.h或B.h进行二次封装,更改其冲突的函数名。