是否可以在 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++ 成员方法?的主要内容,如果未能解决你的问题,请参考以下文章