C++:避免结构体重复定义的方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dashumak/article/details/84062075

最近在做项目移植工作,将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.使用命名空间

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

猜你喜欢

转载自blog.csdn.net/dashumak/article/details/84062075