1

関数をエクスポートするdllを書いています

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

コンパイラは文句を言います:

エラー C2526: 'create': C リンケージ関数は C++ クラス 'std::list<_Ty>' を返すことができません

extern "C" を削除すると、エクスポートされる関数名は ?create@@YA?AV?$list@PAUanalyzer@@V?$allocator@PAUanalyzer@@@std@@@std@@XZ になります。

名前をきれいにしたいので、extern「C」を追加しましたが、競合するようになりました

きれいな関数名を取得できる他の方法はありますか?

ありがとう。

4

2 に答える 2

0

オブジェクトの代わりにポインターを返すことができます。

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

C++ の性質上、呼び出し元は互換性のある ABI を持っている必要があります。

于 2020-12-28T15:49:39.997 に答える