使用原始函数名导出c ++函数

时间:2013-11-11 05:29:11

标签: c++ dllexport

我正在编写一个导出函数的dll

extern "C"
__declspec(dllexport)
std::list<string> create() {
return std::list<string>();
}

编译器抱怨:

  

错误C2526:'create':C连接函数无法返回C ++类'std :: list&lt; _Ty&gt;'

如果我删除extern“C”,导出的函数名称将为: ?创建@@ YA?AV?$ @表@@ PAUanalyzer V'$ @分配器@@@ PAUanalyzer性病性病@@@ @@ XZ

我希望名称干净,所以我添加了extern“C”,现在它冲突了

任何其他方式都可以得到一个干净的函数名称?

感谢。

2 个答案:

答案 0 :(得分:3)

当你说extern "C"时,你告诉编译器创建一个可以从C ++以外的其他语言调用的函数(最值得注意的是C)。但是,除了C ++之外没有其他语言有std::list,所以它不能创建这样的函数,因为返回类型是C ++中函数签名的一部分。如果您不创建具有C兼容返回类型(或参数)的函数,则无法创建extern "C"函数。

如果您要使用C ++程序中的DLL,则不需要extern "C"部分。无论如何,C ++编译器和链接器都能够毫无问题地处理受损的名称。

答案 1 :(得分:0)

你可以返回一个指针而不是对象。

extern "C" __declspec(dllexport) std::list<std::string>* createAllocated()
{
    return new std::list<std::string>();
}

由于 C++ 的性质,调用者需要具有兼容的 ABI。