2011-06-30 1 views
5

私はいくつかのC/C++コードをJavaに変換する必要があります。私のC++は非常に錆びています。 .hファイルでextern "C"に関するC++からJavaへの変換の質問

、私は次のようしている:

#ifdef __cplusplus 
extern "C" { 
#endif 

/* tons of declarations */ 

#ifdef __cplusplus 
} /* extern C */ 
#endif 

extern "C"の使用は何ですか?どういう意味ですか?それは対応するコードがC++ではなく純粋なCとして解釈されるべきであることをコンパイラに伝えていますか?これまでに答えを

EDIT

感謝。私が変換しなければならないコードの歴史は、最初にC言語で書かれた部分がC++で書かれたように見えることです。だから私のヘッダファイルは '古い' Cコードに対応しているようです。

このコードを静的メソッドと属性を持つpublic final classに変換します。オーバーライドしません。

答えて

4

機能署名がCと互換性があることをコンパイラーに伝えています。名前のマングリングはCとC++で異なります(C++ではメソッドのオーバーロードがサポートされていますが、Cではサポートされていないため)。C関数の一部の関数呼び出し(DLLの動的呼び出し)をCの署名と互換性を持たせるには、C++コードでextern Cを使用します。

Take a look at this StackOverflow question for a great explanation on the topic

+1

つまり、Cはまったく名前を変更しません。 – EJP

4

Extern "C"は、C++スタイルの代わりにCスタイルのリンクを示すために使用されます。 C++コンパイラは関数のシンボルに型情報を追加しますが、Cコンパイラはその情報を追加しません。

ライブラリを外部アプリケーションで使用する必要がある場合は、extern "C"が必須です.C++コンパイラは型情報に関してほとんど互換性がないためです。これは、たとえばJavaでネイティブ実装を作成する必要がある場合です。

2

Extern "C"は、C++スタイルの代わりにCリンキングスタイルを示しています。これは、コンパイラに "私の関数名を網羅しないでください"と伝えます。これは、C++プログラムをCプログラムとリンクさせるために使用されます。何かをJavaに変換する場合は、これを無視するのがおそらく安全です。この行は、コードをCまたはC++に変換しようとしている場合にのみ重要です。

関連する問題