extern "C" 带有类和 DLL

2024-01-27

我得到了一个 C++ DLL 源代码,它使用extern "C":

extern "C"
{
    class Something
    {
       public:
         __declspec(dllexport) Something();
         __declspec(dllexport) virtual ~Something();
         __declspec(dllexport) bool function_one(const char * some_text);
         static __declspec(dllexport) char * get_version();
       private:
          unsigned int m_data;
    };
}

DLL 正在由 C++ 程序调用。 仅供参考,在 Windows 7 平台上使用 Visual Studio 2017。

问题*(全部与extern "C" and class):

  1. Since class不是C语言,这相当于struct?
  2. 构造函数有效吗?
  3. 虚拟析构函数是否有效(因为 C 没有virtual)?
  4. 怎么样bool处理?
  5. How is static内处理extern "C"为了班级?
  6. How is private内部处理的数据extern "C" block?
  7. How is noexcept处理在extern "C"块为 构造函数?

Visual Studio 2017 编译器不会使用上述代码生成任何错误或警告。

VS2017代码分析器仅对构造函数生成警告:

C26439 This kind of function may not throw. Declare it 'noexcept' (f.6).

研究:
StackOverflow 上与此问题相关的问题提到“extern “C”has the effect of resolving name mangling. However, they don't address the issues ofvirtual,bool`、私有数据等,如我上面列出的。

另外,许多 DLL 相关的答案建议不要使用非 POD 结构,因为编译器之间的布局可能会发生变化(包括相同版本的编译器);例如,字符数组优于std::string.


它不会将代码更改为 C。它不会导致执行任何 C++ 名称修改 - 因此您不能重载公开为的函数extern "C"例如,在该块内,但代码仍然是 C++。

你只是被限制不能做那些不能从 C 调用的事情(在extern "C"堵塞)。您正在公开 C API,但您仍然可以在幕后使用 C++。只是不在你的extern "C" 界面的一部分.

这也意味着您不能导出成员函数(virtual或不)作为extern "C"因为C没有这样的东西。

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

extern "C" 带有类和 DLL 的相关文章

随机推荐

  • 从序列创建关系矩阵 (Matlab)

    我有一个序列 S S ABCD which means A
  • TwiML 应用程序:如果呼叫者在应用程序过程中挂断,Twilio 是否会通知应用程序挂断?

    我正在尝试找出一种方法来捕获调用者是否在 TwiML 指令中间挂断 如果呼叫者挂断 放弃呼叫 twilio 是否会通知应用程序 我看到状态回调 url 设置 但我只得到 已完成 状态 我想知道如果呼叫者正在聚会并挂断电话 twilio 会知
  • 组件函数运行多次react

    我正在制作一个基于的显示页面match params来自react router 4 出于某种原因 某些函数运行了3次 这给了我前两次未定义的结果 第三次给出了我想要的结果 所以我有这个 Show 组件 它具有来自主组件的道具 项目 在这个
  • 只能应用于给定类类型的扩展

    我想创建一个只有 UIView 的子类才能遵守的协议 有没有办法做到这一点 The Protocol protocol MyProtocol func someMethod This works fine class MyView UIVi
  • 不返回 group_concat 具有空值的行

    我有以下 MySQL 查询 该查询应该从表 a 和 b 一对多关系 返回记录 以及从表 c 返回的任何值的逗号分隔列表 但是 表 c 中并不总是有记录 这就是为什么我使用 LEFT OUTER JOIN 将其连接到表 a SELECT a
  • C2059 语法错误“字符串”?

    extern C endif include
  • 如何抑制Excel下载时的文件损坏警告?

    我有一个链接到 Excel 2007 工作表的网页 它是一个 xls文件而不是 xlsx文件 当我单击链接时 我会看到通常的对话框 用于打开 保存 Excel 文件 单击 打开 后 我收到以下警告消息 您尝试打开的文件 filename x
  • 如何在没有 Visual Studio 的情况下安装 MSBuild 15.3?

    有没有办法在构建服务器上安装 MSBuild 15 3 版本而不安装 Visual Studio 2017 我尝试安装 Build Tools for Visual Studio 2017 https www visualstudio co
  • 在页面中央打印 html 文本

    我有一个下一个问题 试图用谷歌找到它 但没有找到什么可以帮助我 我有一个大的 HTML 文件需要打印 我使用 CSS 来分隔页面break after 问题是 如何在页面中央打印一个元素 不仅是水平居中 而且是垂直居中 HTML 看起来像这
  • 如何获取制表符?

    在 HTML 中 选项卡没有字符 但我很困惑为什么我可以在此处复制并粘贴一个字符 您看不到它的完整宽度 但如果您单击编辑我的问题 您会看到该字符 如果我可以复制并粘贴制表符 那么应该有一个可以编码为 html 的 unicode 等效项 我
  • 使用 ADFS IdP 进行单点注销的正确 LogoutRequest

    我成功使用 OneLogin java saml 库进行 SAML SSO 但 Active Directory 联合身份验证服务 ADFS 的 SLO 单点注销 存在问题 该库创建的 LogoutRequest 被 ADFS 拒绝 但被
  • 点覆盖问题

    我最近在测试中遇到了这个问题 给定一组点m 全部在 x 轴上 和一组n具有端点的线 l r 再次在 x 轴上 找到 的最小子集n这样所有的点都被一条线覆盖 证明你的解决方案总是能找到最小子集 我为它编写的算法的效果是 假设线存储为数组 左端
  • SQL-将长整数转换为日期时间

    我有一个数据库 其日期采用以下长整数格式 20100101000000 其中该时间为 2010 年 1 月 1 日 00 00 00 我希望能够将其转换为正常的 SQL 日期时间语法并返回 这可能吗 我只能走到这一步 SELECT CAST
  • 事务之间的竞争条件

    我正在使用 Spring MVC 开发 webapp 并在我的应用程序中有这样的方法 Transactional public void methodA Long id String color Fruit fruit entityMana
  • in_array() 期望参数 2 为数组,Classipress 中给出的字符串

    我在用着Classipress theme对于 wordpress 我正在尝试将我的精选广告粘贴到类别中 我发现一个返回此错误的代码 Warning in array expects parameter 2 to be array stri
  • Android 上 之间的区别

    我现在对两个明显元素之间的区别感到困惑 我认为仅使用 Google Play 会过滤掉不属于支持屏幕列表的设备 该应用程序不会显示在这些设备上的搜索结果中 我以为使用就足够了 但似乎不起作用 我也需要包含吗 有人可以向我解释自然语言的区别吗
  • 如何通过jquery从数据库接收数据? [wordpress.js]

    我正在尝试从 WordPress 主题的 js 文件中的数据库中获取一些数据 我尝试使用 jquery 的 post 但没有任何反应 还请建议我任何替代方案 js 文件中的代码 jq post abc php name kumar accI
  • 磁带平衡 Codility 培训计划

    我在 Codility 中提交了磁带平衡问题的解决方案 礼貌培训 1 问题描述如下 给出一个由 N 个整数组成的非空零索引数组 A 数组 A 代表磁带上的数字 任何整数 P 使得 0 我提交的解决方案是 class Solution pub
  • 我怎样才能避免codeigniter中的URL中的index.php [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在使用 apache 服务器 我
  • extern "C" 带有类和 DLL

    我得到了一个 C DLL 源代码 它使用extern C extern C class Something public declspec dllexport Something declspec dllexport virtual Som