c++关于动态库中的类与自身程序类重名的后果?

wopksizhu 2019-03-26 10:38:31
在动态库load.dll中,存在基类BASE,和子类 SUBCLASS, 动态库提供对外调用接口函数 void* createClass() { return (void*)(new SUBCLASS); } 这个时候,如果在自己程序中也有类BASE,调用动态库接口函数 auto value=(BASE*)createClass(); 假如我的BASE和动态库中的BASE一模一样,是不是不管怎么使用 value都不会出问题? 如果不一样,是不是调用value中任何函数或者成员都会出现地址异常? 求各位大神 帮忙
...全文
354 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
一见 2019-04-02
  • 打赏
  • 举报
回复
首先这是个坑。 即使两个同名类的定义是相同的,但是不同编译会影响它(主要是字节对齐),而且调用DLL创建的对象,实际是DLL中的对象,这样当两者字节对齐方式导致内存布局产生差异就会有问题了。
林多 2019-03-26
  • 打赏
  • 举报
回复
引用 3 楼 wopksizhu 的回复:
[quote=引用 2 楼 林多的回复:]如果两个BASE,写的一模一样的话。使用时,不会出现问题。 如果两个BASE有差别,调用BASE类中暴露的接口时,肯定会有问题的。。。但不能说,调用每个接口,都有会问题。。比方说

class YouBase
{
public:
    // func1接口没问题
     void func1();
     void func2();
    // 调用。func3接口有问题,因为地址偏移不同(其实就是地址错了)。
     void func3();
};

class LibBase
{
public:
    void func1();
    void func3();
    void func4();
};

如上,从地址偏移错误的地方开始,就会存在问题了。。。在程序里,直观的反应是,明明调用的是函数A,实际调用的确实函数B(这种情况比较难调查),然后导致莫名其妙的的crash。
多谢,类似我这种使用方法,工程项目中常见吗? 我自己这么用 总感觉怪怪的,是不是两个程序链同一个静态库好一点。[/quote] 其实挺常见的。。现在,很多大型项目(项目中,又包含上百个小项目)中,很多小模块都是以二进制形式发布(lib、资源文件、对外公开头文件)。。这样的话,在编译项目时,就不需要编译这些模块的代码。会加快,开发的效率。 所以,这种公开lib,及头文件的方式,很常用。 但一般来讲,公开的头文件,直接用就好了。如果存在同名的情况,用命名空间区分。 ========== 链静态库的话,会导致编译出来的内容,体积增大,浪费资源的。
wopksizhu 2019-03-26
  • 打赏
  • 举报
回复
引用 2 楼 林多的回复:
如果两个BASE,写的一模一样的话。使用时,不会出现问题。 如果两个BASE有差别,调用BASE类中暴露的接口时,肯定会有问题的。。。但不能说,调用每个接口,都有会问题。。比方说

class YouBase
{
public:
    // func1接口没问题
     void func1();
     void func2();
    // 调用。func3接口有问题,因为地址偏移不同(其实就是地址错了)。
     void func3();
};

class LibBase
{
public:
    void func1();
    void func3();
    void func4();
};

如上,从地址偏移错误的地方开始,就会存在问题了。。。在程序里,直观的反应是,明明调用的是函数A,实际调用的确实函数B(这种情况比较难调查),然后导致莫名其妙的的crash。
多谢,类似我这种使用方法,工程项目中常见吗? 我自己这么用 总感觉怪怪的,是不是两个程序链同一个静态库好一点。
林多 2019-03-26
  • 打赏
  • 举报
回复
如果两个BASE,写的一模一样的话。使用时,不会出现问题。 如果两个BASE有差别,调用BASE类中暴露的接口时,肯定会有问题的。。。但不能说,调用每个接口,都有会问题。。比方说

class YouBase
{
public:
    // func1接口没问题
     void func1();
     void func2();
    // 调用。func3接口有问题,因为地址偏移不同(其实就是地址错了)。
     void func3();
};

class LibBase
{
public:
    void func1();
    void func3();
    void func4();
};

如上,从地址偏移错误的地方开始,就会存在问题了。。。在程序里,直观的反应是,明明调用的是函数A,实际调用的确实函数B(这种情况比较难调查),然后导致莫名其妙的的crash。
sdghchj 2019-03-26
  • 打赏
  • 举报
回复
如果BASE仅仅是个接口就肯定没问题,相同的编译器应该也没啥问题。否则有很多成员变量情况下若是不同的编译器编译的可能会成员错位。

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧