1

これは C または C++ でどのように機能しますか?

extern "C" {
#include <unistd.h>
#include <fd_config.h>
#include <ut_trace.h>
#include <sys/stat.h>
#include <sys/types.h>
}
4

4 に答える 4

5

C++ 標準では、コンパイラがオブジェクト ファイル内のシンボルにどのように名前を付ける必要があるかを指定していません (たとえば、gobbledygookFoo::bar()として終わる可能性があります)。__clsFoo_fncBarC 標準はそうであり、ほとんどの場合、C++ コンパイラがそれを行う方法とは異なります (C は、クラス、名前空間、オーバーロードなどを処理する必要はありません)。

その結果、C コンパイラによって出力されたオブジェクト ファイルに対してリンクする場合、C 標準に対応する名前のシンボルを探すように C++ コンパイラに指示する必要があります。基本的に「Cモード」に入れています。これは、の"C"部分がextern "C"行うことです。

(あるいは、外部の C オブジェクト ファイルで使用できる関数または変数を宣言することもできます。この場合、これらのシンボルを C の方法でエクスポートすることを意味します。)

于 2010-02-15T07:12:34.817 に答える
2

プロジェクトに C および C++ ソース ファイルがあり、全体としてビルドする必要がある場合 (C ファイルは C++ ファイル内のいくつかの関数を呼び出します)、C ファイルの関数呼び出しとシンボルを C++ ファイルのように宣言して保護する必要があります。

extern "C" { / c ファイルで使用されるシンボル/ uint8 GetCurrentthreadState(HANDLE ThreadId)

}

次に、C++ コンパイラは、上記で宣言された関数とシンボルの C コンパイラと同じコンパイル出力を生成します。そのため、リンク時に、コンパイラは C および C++ で定義されたシンボルをリンク エラーなしで簡単にリンクできます。

したがって、コンパイル時に#ifdef __cplusplusチェックを行うのに私の意見は必要ありません。C++ ファイルのシンボルを保護する必要があるからですよね? また、C++ ファイルは C++ コンパイラだけでコンパイルできますか?

/renjith g

于 2010-02-15T08:54:19.120 に答える
1

cplusplus プリプロセッサを追加する必要があります...

#ifdef __cplusplus
extern "C" {
#endif

// your code


#ifdef __cplusplus
}
#endif

編集:

C++ では、名前は C のように扱われます。つまり、マングル名はありません。ライブラリ内の異なる引数の型/数または異なる名前空間 (ライブラリの目的 libname.so、libname.a) を持つ 2 つの C++ の異なる関数を区別することができます。名前が壊れていると、C プログラムはそれを認識できなくなります。

eg:
int myfction()
void myfunction(int)
void myfunction(int, char)

C library:   myfction

C++ library: int_myction (it depend on your compiler)
C++ library: int_myction_int (it depend on your compiler)
C++ library: int_myction_int_char (it depend on your compiler)
// ... which is not allowed in C program
于 2010-02-15T07:04:37.383 に答える
0

すべての C++ コンパイラは、extern "C" リンケージをサポートする必要があります。このようなブロック内のコードは、現在のプログラムに必要な特定の機能のために C で記述されたレガシー コードである可能性があります。

これがどのように実装されるかはほとんどコンパイラに依存しますが、多くのコンパイラは名前マングリングを無効にし、呼び出し規約を変更していると聞きました。

于 2010-02-15T08:35:37.557 に答える