我正在编写一个导出函数的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”,现在它冲突了
任何其他方式都可以得到一个干净的函数名称?
感谢。
答案 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。