pImpl 是否从根本上解决了 C++ DLL 问题?

2024-03-25

我正在尝试从带有 stl 成员的 DLL 中导出 C++ 类。

这是我的主要课程。

class MATHFUNCSDLL_API MyMathFuncsImpl
    {
    public: 

       std::vector<int> vi;
      std::string getString();
      void setString(std::string s);
    private:
       std::string s;
    };

使用这些方法是可行的,但会在 VS 2012 上发出有关 std::string 和 std::vector 没有 dll 接口的警告。现在当我这样做时 -

class  MATHFUNCSDLL_API MyMathFuncs
    {
    public:
       MyMathFuncs()
       {
          pImpl = new MyMathFuncsImpl();
       }
       std::string getString()
       {
          return pImpl->getString();
       }

       std::vector<int> getVector()
       {
          return pImpl->vi;
       }

       void setString(std::string news)
       {
          pImpl->setString(news);
       }
    private:
       MyMathFuncsImpl* pImpl;
    };

我没有收到任何警告,而且它也有效。我的问题是:拥有这样的接口是否真的可以解决问题(stl 成员可能在 dll 边界上以不同的方式实现),或者只是抑制编译器问题的一个技巧?


Yes.

切勿在 DLL 接口中使用内联函数。这包括应该显式声明但在实现文件中定义的构造函数和析构函数。对于 C++,这意味着您应该使用 pImpl 习惯用法或虚拟基类。

避免内联函数的原因是它们可能从一个版本到下一个版本发生变化,而 DLL 保持不变。任何不匹配都会导致奇怪和可怕的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pImpl 是否从根本上解决了 C++ DLL 问题? 的相关文章

随机推荐

  • 带有部分粗体文本的自定义 UITableViewCell

    尝试实现类似于内置联系人 iPhone 应用程序的名称 UITableView 其中名字为普通字体 姓氏为粗体 快速谷歌一下后发现 这并不像听起来那么容易 因为 iPhone SDK 缺乏 UILabels 中的富文本支持 找到的解决方案之
  • 在本地主机上运行时 Google Optimize 不会触发

    我正在尝试通过以下方式在 JavaScript 中获取 Google Optimize 实验数据这些说明 https support google com optimize answer 9059383 但我没有得到回调 也看不到调试器中发
  • Go的修订历史背后有什么故事?

    我注意到前 4 次修订f6182e5abf5e b66d0bf8da3e ac3363d7e788 172d32922e72Go 源代码都早在 Golang 被提出之前就已经存在了 最古老的是1972年 https github com g
  • 有没有什么方法可以禁用 ORMLite 检查使用 DataType.SERIALIZABLE 声明的字段是否实现了可序列化?

    问题标题已经说明了一切 我有一个这样声明的字段 DatabaseField canBeNull false dataType DataType SERIALIZABLE List
  • Azure Blob 存储 blob 到索引

    是否可以将文档上传到 Blob 存储并执行以下操作 获取文档内容并添加到索引 从第 1 点的内容中抓取关键短语并添加到索引中 我希望关键短语可以被搜索 我有代码可以将文档上传到 blobstorage 效果非常好 但获得此索引的唯一方法 据
  • 无法使用 primeng 虚拟滚动延迟加载

    我正在尝试使用 primeng 对大量数据实现延迟加载
  • 如何在 PDFsharp 中设置 DPI(每英寸点数)

    有没有办法在 PDFsharp 的情况下设置 DPI 每英寸点数 Thanks 不 PDF 文件是没有 DPI 的矢量文件 如果您的问题是关于 PDF 文件中存储的图像 PDFsharp 在图像出现时对其进行存储 PDFsharp 尚未通过
  • 将平方和立方项转换为乘法

    我正在尝试使用 sympy 中的 ccode 将来自 sage 的大表达式转换为有效的 C 代码 然而 我的表达式有很多平方和立方项 由于 pow x 2 比 x x 慢得多 因此我尝试在转换之前在表达式中扩展这些术语 基于this htt
  • 如何让两个雷神任务共享选项?

    有了托尔 人们就可以使用method option https github com wycats thor wiki Method Options设置特定任务的选项 要为班级中的所有任务设置选项 可以使用class option 但是 如
  • 使用流 API 更新新列后无法将新值插入 BigQuery 表

    我在 bigquery 表中发现了一些奇怪的行为 我刚刚创建了一个新列 在表中添加了一个新列 它在界面上看起来不错 并通过 api 获取架构 但是 当向新列添加值时 出现以下错误 insertErrors errors message no
  • Android 实时音频分析

    我已经在网上搜索过这个 但仍然有点困惑 因为我相信其他人如果想到这样的事情也会感到困惑 我想在序言中说 这是not为了家庭作业和 或利润 我想创建一个应用程序 可以在您准备爆米花时监听微波炉的声音 当弹出声音之间有一定的时间间隔 比如 5
  • 访问另一个结构体指针内的结构体指针内的元素

    只是想了解结构体的嵌套指针如何工作 如何访问另一个指向结构的指针中的结构指针中的元素 谢谢 include
  • 如何让 Qt 识别 QMYSQL 驱动程序

    我试图从 Qt 应用程序访问 MySql 数据库 但出现以下错误 QSqlDatabase QMYSQL driver not loaded QSqlDatabase available drivers QSQLITE QSQLITE2 我
  • 确定 Java 8 中的列表是否由字谜元素组成

    我想确定列表是否是字谜或不使用 Java 8 输入示例 cat cta act atc tac tca 我已经编写了以下函数来完成这项工作 但我想知道是否有更好 更优雅的方法来完成这项工作 boolean isAnagram String
  • Kotlin 和 Firebase 读写数据

    我已经学习 Kotlin 3 周了 所以我想从我的 Firebase 数据库中读取数据 这是写入数据的MainActivity kt val database Firebase database val latitude latitude
  • 如何使用 shell 脚本连接 2 个 csv 文件?

    我正在尝试制作一个 shell 脚本 它将通过以下方式组合两个 csv 文件 我有两个 csv 文件 f1 csv 和 f2 csv f1 csv的格式为 startId endId roomNum f2 csv 的格式如下 startId
  • 使用 Wget 跳过成功下载的文件

    所以我有这个 Bash 子例程来使用 wget 下载文件 现在我的问题是如何跳过成功下载的文件 该脚本会下载很多文件 一旦下载失败 它会重新下载所有文件 覆盖那些从一开始就成功的下载 可能会因为重新下载而不完整 那么如何跳过那些下载成功的文
  • Heroku 上的媒体文件

    如果我在 Heroku 上托管一个小型 Django 网站 并且只使用一台 dyno 那么是否可以在该服务器上上传媒体文件 或者我是否必须使用 AWS S3 存储来存储媒体文件 媒体存储还有哪些其他替代方案 不 在 Heroku 文件系统上
  • 如何以编程方式检查、获取和设置 Android 手机中的触摸设置?

    是否可以通过编程方式获取 Android 中的各种触摸设置 例如 gt 拨号盘按键音 gt 触摸声音 gt 屏幕锁定声音 gt 触摸时振动 我尝试访问 System Settings 中的各种常量 但我没有看到任何提及触摸设置的常量 任何人
  • pImpl 是否从根本上解决了 C++ DLL 问题?

    我正在尝试从带有 stl 成员的 DLL 中导出 C 类 这是我的主要课程 class MATHFUNCSDLL API MyMathFuncsImpl public std vector