是否可以在 DLL 中导出具有 C 链接的 C++ 成员方法?

Posted

技术标签:

【中文标题】是否可以在 DLL 中导出具有 C 链接的 C++ 成员方法?【英文标题】:Is it possible to export a C++ member method with C linkage in a DLL? 【发布时间】:2014-12-12 10:18:44 【问题描述】:

在 cpp 文件中考虑这个:

struct someStruct
    public:
    extern "C"  __declspec(dllexport) int sumup();
 someStruct;

extern "C" __declspec(dllexport) int someStruct::sumup()

    return 0;

这不能编译:error: expected unqualified-id before string constant 不能用C链接导出C++成员方法吗?

【问题讨论】:

你认为在 C 代码中调用成员函数会如何工作? 可能的,只是不是很漂亮,因为你必须使用修饰的名称(虽然已经 15 年没有这样做了)。 C++ 程序员总是必须为 C 库提供回调函数,包括……Win32 API。很可能那里有重复的答案 " C++ 程序员总是必须为 C 库提供回调函数,包括 ... Win32 API" - 不确定这与它有什么关系,因为成员函数不能用作回调。 【参考方案1】:

首先,链接规范不适用于成员函数;通过 [dcl.link]/4:

[...] 链接规范应仅出现在命名空间范围 (3.3) 中。 [...]

但在同一段落中,标准中甚至还有一个与您的问题有些相关的示例:

[...] 在确定类成员名称的语言链接和类成员函数的函数类型时,将忽略 C 语言链接。 [例子:

extern "C" typedef void FUNC_c();
class C 
  void mf1(FUNC_c*);      // the name of the function mf1 and the member
                          // function’s type have C ++ language linkage; the
                          // parameter has type pointer to C function
  FUNC_c mf2;             // the name of the function mf2 and the member
                          // function’s type have C ++ language linkage
  static FUNC_c* q;       // the name of the data member q has C ++ language
                          // linkage and the data member’s type is pointer to
                          // C function
;

extern "C" 
  class X 
    void mf();            // the name of the function mf and the member
                          // function’s type have C ++ language linkage
    void mf2(void(*)());  // the name of the function mf2 has C ++ language
                          // linkage; the parameter has type pointer to
                          // C function
  
;

——结束示例]

【讨论】:

【参考方案2】:

没有。它不是那样工作的。它根本不起作用。做不到。没办法。

【讨论】:

您以前可能没有遇到过,但是必须将回调函数从 C++ 应用程序传递给 C 库的情况并不少见。 不是成员函数。

以上是关于是否可以在 DLL 中导出具有 C 链接的 C++ 成员方法?的主要内容,如果未能解决你的问题,请参考以下文章

在 VS2010 (CUDA) 中导出 DLL 的问题

动态链接库中导出模板函数

为啥我可以链接两个库在 VC 中导出相同的 C-Function?

如何从 dll 中导出没有名称的函数

如何构建在unity/c#中导入的c++ dll

怎样从一个DLL中导出一个C++类