10

GCCとICCで問題なくコンパイルできる小さなプログラムがありますが、コードをG++とICPCでも動作させたいと思います。私はこれを追加しようとしました:

#ifdef __cplusplus
  extern "C" {
#endif

最初とこれ:

#ifdef __cplusplus
  }
#endif

すべてのヘッダーファイルの最後にありますが、それでも「...」への「未定義の参照」エラーがいくつか発生します。

4

4 に答える 4

9

間違っていると思います...externCは、関数のマングリングを無効にするためのものです。したがって、ヘッダーファイルに対してのみ実行すると、マングルされたオブジェクトコードをリンクしようとすると、宣言された関数名がオブジェクトファイルの関数名と一致しなくなります。

とにかく、アプリケーション全体がコンパイルされ、同じC ++コンパイラでリンクされている場合、extern Cは移植性を追加しません。これは、CライブラリとC++コードを混在させることを目的としています。

コードがCとC++の共通のサブセットにある場合は、どちらのコンパイラでもコンパイルできるはずですが、その理由はわかりません(C ++はより厳密であるため、驚き最小の原則に基づいて作業する以外に)いくつかのこと)。

于 2010-05-13T14:01:51.593 に答える
2

を入力すると宣言と定義が一致しないため、未定義の参照が取得されますextern "C"。これにより、名前のマングリングが発生しなくなります。ただし、この場合、これはヘッダーファイルでのみ発生します。

于 2010-05-13T14:02:08.153 に答える
1

未定義の参照の1つがgxx_personalityである場合、「fortran」による投稿は正しいと言えます。

于 2010-05-13T14:06:37.500 に答える
1

この以前の質問に対する私の回答を参照してください:extern "C"を簡単な言葉で使用するのはいつですか?

うまくいけば、CコードとC++コードを組み合わせる方法が明確になるはずです。

于 2010-05-13T14:17:30.393 に答える