C++:避免結構體重複定義的方法
阿新 • • 發佈:2018-11-15
最近在做專案移植工作,將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.使用名稱空間
這種方法更加廣泛,尤其適合於重名且定義的內容不一樣的情況。這種方法等有時間了,我再在下邊補充,本次使用了巨集定義就解決了上述問題。