C からの C 関数の呼び出し: 名前マングリングのナビゲート
混合言語アプリケーションを使用する場合、C 内から C 関数を呼び出すという課題があります。 C の名前のマングリングが原因で発生します。単純な関数名を使用する C とは異なり、C では、オーバーロードされた関数とクラスを解決するために複雑な命名スキームを採用しており、その結果、関数シグネチャが異なります。これにより、未解決のシンボルを解決しようとするとリンカー エラーが発生する可能性があります。
このような場合、回避策として、C 機能へのアクセスを提供する C API を作成する必要があります。これには、extern "C" として宣言された C コードを記述し、純粋な C 構文に準拠し、クラスなどのオブジェクト指向機能を回避する必要があります。その後、C ライブラリの機能を公開するために C ラッパー ライブラリが作成されます。
たとえば、次の C API について考えてみましょう。
#ifdef __cplusplus #define EXTERNC extern "C" #else #define EXTERNC #endif typedef void* mylibrary_mytype_t; EXTERNC mylibrary_mytype_t mylibrary_mytype_init(); EXTERNC void mylibrary_mytype_destroy(mylibrary_mytype_t mytype); EXTERNC void mylibrary_mytype_doit(mylibrary_mytype_t self, int param); #undef EXTERNC
対応する C 実装は次のようになります。
mylibrary_mytype_t mylibrary_mytype_init() { return new MyType; } void mylibrary_mytype_destroy(mylibrary_mytype_t untyped_ptr) { MyType* typed_ptr = static_cast<MyType*>(untyped_ptr); delete typed_ptr; } void mylibrary_mytype_doit(mylibrary_mytype_t untyped_self, int param) { MyType* typed_self = static_cast<MyType*>(untyped_self); typed_self->doIt(param); }
このアプローチにより、名前のマングリングの問題を軽減しながら、C コードから C の機能にアクセスできます。
以上がC コードから C 関数を呼び出し、名前のマングリングの問題を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。