欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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.使用命名空间

这种方法更加广泛,尤其适合于重名且定义的内容不一样的情况。这种方法等有时间了,我再在下边补充,本次使用了宏定义就解决了上述问题。

相关标签: 结构体重定义