C++:避免结构体重复定义的方法
程序员文章站
2022-06-10 13:08:11
...
最近在做项目移植工作,将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.使用命名空间
这种方法更加广泛,尤其适合于重名且定义的内容不一样的情况。这种方法等有时间了,我再在下边补充,本次使用了宏定义就解决了上述问题。
上一篇: 百度地图
下一篇: 大数据技术在企业生产中的应用