2

G++ (Linux のバージョン 4.5 など) を使用している場合、ユーザーが混合 C/C++ システムのヘッダー ファイルを次のように記述した場合に何が起こるか、または何が起こる可能性があるかを誰でも説明できます。

#ifdef __cplusplus 

extern "C" {

int myCPPfunc(some_arg_list....); /* a C++ function */

}
#endif

しかし、myCPPfunc()これは内部にクラス定義を持つ通常の C++ 関数です。つまり、C 関数として誤ってラベル付けされています。

これの影響は何ですか?

4

4 に答える 4

1

これは、ヘッダーファイルで宣言された関数がC関数であることをC++コンパイラに通知します。

http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.2

于 2012-04-17T18:54:42.153 に答える
1

これの主な影響は、オーバーロードできないことです。たとえば、これは合法です。

int myCPPfunc(int a);
int myCPPfunc(char a);

しかし、これはそうではありません:

extern "C"
{
    int myCPPfunc(int a);
    int myCPPfunc(char a);
}
于 2012-04-17T18:51:45.607 に答える
1

関数の実装extern "C"任意の C++ 機能を使用することは完全に正当です。できないことは、そのインターフェイスを C ではできないものにすることです。たとえば、引数のオーバーロード、メソッド (仮想またはその他)、テンプレートなどです。

「C ではできないこと」の多くは、プロンプトのコンパイル エラーではなく、未定義の動作を引き起こすことに注意してください。

于 2012-04-17T18:51:53.720 に答える
0

これはまさにそのextern "C"ためのものです.Cから呼び出すことができるC++関数を書くことができます.

myCPPfunc()基本的に、その宣言は、C++ 関数に Cからリンク可能な (したがって呼び出し可能な) 外部インターフェイスを持たせることを C++ コンパイラに伝えます。

関数の実装は引き続き C++ であり、C++ 機能を引き続き使用できます。

通常、ヘッダー ファイル内の関数の宣言は次のようになります。

#ifdef __cplusplus 
extern "C" {
#endif

int myCPPfunc(some_arg_list....); /* a C++ function */

#ifdef __cplusplus 
}
#endif

これにより、同じヘッダー ファイルを C++ コンパイラまたは C コンパイラで使用できるようになり、それぞれが C 呼び出し可能関数を宣言していると見なされます。

于 2012-04-17T19:32:17.170 に答える