10

extern "C"C関数として定義する必要のある関数に指定すべきではないのはなぜですか?ファイルをCソースとしてコンパイルすると、コンパイラにどのような影響がありますか?

Cコンパイラに影響がない場合は、#ifdef __cplusplusチェックを外して、以下のようにヘッダーファイルに関数を定義するだけではいけませんか?

extern "C" {
    int MyFunc();
}

別の質問への回答は、が必要であると言ってい#ifdefますが、理由がわかりません。

#2に関して:__ cplusplusは、C++コンパイラーを介して実行されているすべてのコンパイル単位に対して定義されます。一般に、これは.cppファイルとその.cppファイルに含まれるすべてのファイルを意味します。同じ.h(または.hhまたは.hppまたはwhat-have-you)は、異なるコンパイル単位に含まれている場合、異なる時点でCまたはC++として解釈される可能性があります。.hファイル内のプロトタイプがCシンボル名を参照するようにするextern "C"場合は、C ++として解釈されるときに持つ必要があり、Cextern "C"として解釈されるときに持つべきではありません。したがって、#ifdef __cplusplusチェックします。

4

2 に答える 2

21

コンストラクトextern "C"は C++ コンストラクトであり、C コンパイラによって認識されません。通常、構文エラー メッセージが発行されます。

一般的なトリックは、EXTERN_C などのマクロを定義することです。このマクロは、C を使用してコンパイルするか C++ を使用してコンパイルするかによって、異なるものに展開されます。例えば:

一般的なヘッダー ファイルでは、次のようになります。

#ifdef __cplusplus
#define EXTERN_C extern "C" {
#define EXTERN_C_END }
#else
#define EXTERN_C
#define EXTERN_C_END
#endif

他のファイルでは:

EXTERN_C
int MyFunc(void);
EXTERN_C_END
于 2012-02-29T12:22:37.700 に答える
2

ソース ファイルを C としてコンパイルすると、 が認識されextern "C"、通常はコンパイル エラーが発生します。

ソース ファイルを C++ としてコンパイルすると、認識されextern "C"、正しい名前がリンクされます。

したがって、C++ としてコンパイルするファイルの C シンボル名を指定するためにのみ確実に使用できます。

ソースを C および C++ としてコンパイルする場合、またはインターフェイスが C および C++ クライアント向けである場合、クライアントがリンク (など) 時に正しいシンボルを取得できるように、何らかの方法でこれを指定する必要があります。

関連: C++ の翻訳用に -を書くこと許可されています。extern "C++"

于 2012-02-29T12:33:01.693 に答える