這裡要說的不是用宏來防止頭文件重複包含。
在結構中定義一個宏,以前在公司的軟件里,他們經常這樣用,還是比較巧妙的。
比如一個接口結構:
//邏輯接口
typedef struct tag_stRM_IM_LogicIntf
{
VOS_U32 u32IfnetIndex;
VOS_U32 u32PhyIndex;
//VOS_U32 u32LogicIndex;
STIP_CONFIG stIpCfg;
ENRM_IM_INTF_STATUS enStatus;
VOS_U8 u8RefCount;
#define u32LogicIndex stIpCfg.u32IpAddress
#define u32IntfIpAddress u32LogicIndex
}STRM_IM_LOGICINTF, * PSTRM_IM_LOGICINTF;
這個接口有一個IP地址,在成員stIpCfg里,同時接口又有一個索引,應該叫u32LogicIndex,情況是索引就是該接口的IP地址,但是意義不同。
我們固然可以二者都聲明,但是:
1、兩份數據重複了;
2、要保證數據的一致性。
這樣很不爽。於是乎採用了剛才的方法。
因為接口的IP地址是本質,所以IP地址還是要聲明的。索引只是一個邏輯上的概念,它就是接口的IP,所以我們在結構內定義一個宏,名字就叫u32LogicIndex,看起來像是個“普通的”成員,其實它是stIpCfg.u32IpAddress,如上代碼。爲了使用方便,我們還定義了一個u32IntfIpAddress的宏來更直觀地表示接口IP地址。
注意,儘管這些宏是在結構內定義的,但是還是要注意其名稱的唯一性,不然與別人衝突了很可能編不過。