extern "C"
関数は、C++ 固有のデータ型 (参照、メンバーへのポインター、または非 POD クラス (値渡し) など) を受け入れたり返したりできますか? これを禁止するC++標準には何も見つかりません。論理的には、C ABI がそのような型を渡すのに必ずしも適しているとは限らないため、標準がそれについて何かを言うことを期待しています。
私が C リンケージを使用したい理由は、C コンパイラとは関係ありません。この関数は、C++ コードからのみ呼び出されます。動的ライブラリからマングルされていない関数名をエクスポートしたいだけです。
愚かなコード例:
class Foo {
public:
virtual void doit() = 0;
};
class Bar : public Foo {
public:
void doit() { std::cout << "Bar" << std::endl; }
};
extern "C" Foo& getFoo() { static Bar bar; return bar; }
extern "C" Bar getBar() { return Bar(); }
これは Linux 上の GCC でコンパイルされ、期待どおりに動作します。それは、標準的にすべきですか?
この質問は、この質問へのコメントでの議論のフォローアップです。
更新これを Comeau コンパイラでテストしましたが、問題はありませんでした。