1. 程式人生 > >C++:避免結構體重複定義的方法

C++:避免結構體重複定義的方法

最近在做專案移植工作,將MFC的單文件專案由XP+VC6.0移植到WIn10+VS2017,由於專案本身用到了MFC的第三方可視庫,GuiLib和CJ609Lib,需要從網上下來原始碼在新平臺上移植通過。
在專案使用第三方庫的同時,編譯提示結構體CMenuItemInfo重定義,後來研究了一下,發現Guilib和CJ609Lib的標頭檔案中都全域性定義了同一個結構體名CMenuItemInfo,而解決方法有兩種:使用巨集定義規避和使用名稱空間

1.巨集定義規避

這種方法很簡單,就是類似C++利用巨集避免標頭檔案重複的形式,直接給例項,在兩個關於CMenuItemInfo結構體定義的位置加上一下的巨集定義就行:

#ifndef __CMenuItemInfo_LOCAL_DEFINED//避免結構體CMenuItemInfo重複定義
#define __CMenuItemInfo_LOCAL_DEFINED
struct CMenuItemInfo : public MENUITEMINFO_LOCAL {
    CMenuItemInfo()
    {
        memset(this, 0, sizeof(MENUITEMINFO_LOCAL));
        cbSize = sizeof(MENUITEMINFO_LOCAL);
    }
};
#endif//__CMenuItemInfo_LOCAL_DEFINED

這樣做的好處是,用CMenuItemInfo定義具體物件時,直接使用CMenuItemInfo,程式會自動使用編譯過程遇到的第一個CMenuItemInfo的定義。
但這種方法有一個前提:兩個結構體的定義必須一致,也就是說上述關於CMenuItemInfo的兩個定義必須一致,很巧的是Guilib和CJ609Lib關於CMenuItemInfo的定義確實一致。

2.使用名稱空間

這種方法更加廣泛,尤其適合於重名且定義的內容不一樣的情況。這種方法等有時間了,我再在下邊補充,本次使用了巨集定義就解決了上述問題。