4

ヘッダ:

using namespace std;
extern "C" {
  string testFunc();
}

.cpp:

string testFunc()
{
  return string("test");
}

ビルド時に次の警告が表示されました。

'testFunc' has C-linkage specified, but returns user-defined type 'string' (aka 'basic_string<char>') which is incompatible with C

関数をテストしましたが、「test」が正しく返されました。

この警告は問題を引き起こしますか?

私はAppleLLVM4.2、C99、XCode4.6のすべてのデフォルト設定を使用しています。

4

1 に答える 1

14

おそらく、Cプログラムから呼び出すことができるようにしたいので、の宣言をラップしてtestFuncextern "C"ます。ただし、Cプログラムがこの関数を呼び出すと、std::string元に戻ります。これは、Cとは完全に互換性がありません。プログラムには、それを管理する方法がありません。

testFunc内部にあるべきではないかextern "C"、Cスタイルの方法で(おそらく)として文字列を返す必要がありますconst char*

クラスタイプがCと互換性を持つためには、標準レイアウトクラス(C ++ 11の用語で)である必要があります。

標準レイアウトクラスは、次のようなクラスです。

  • タイプnon-standard-layoutクラス(またはそのようなタイプの配列)または参照の非静的データメンバーがない、
  • 仮想関数(10.3)および仮想基本クラス(10.1)がなく、
  • すべての非静的データメンバーに対して同じアクセス制御(条項11)があり、
  • 非標準レイアウトの基本クラスはありません。
  • 最も派生したクラスに非静的データメンバーがなく、非静的データメンバーを持つ基本クラスが多くても1つないか、非静的データメンバーを持つ基本クラスがない。
  • 最初の非静的データメンバーと同じタイプの基本クラスはありません。

また、タイプが名前空間にある場合、またはテンプレートタイプである場合に発生する、名前がマングルされてはなりません。

于 2013-03-27T09:55:37.243 に答える