C-C 格差の解消: C アプリケーションでの C 機能の公開
混合言語環境で作業する場合、記述されたコードをシームレスに統合する機能異なる言語でのコミュニケーションが重要になります。コードが C および C で記述されている場合、 C の名前マングリングが課題となるため、この問題はさらに顕著になります。
C から C 関数を呼び出す必要性を考慮してください。C ドメインでは、extern " C" キーワードを使用すると、C 互換の方法で関数を公開できるため、C アプリケーションで C 関数を使用する簡単な方法が提供されます。ただし、逆のシナリオでは、C コードが C 関数を呼び出す必要があるため、別の障害が発生します。
名前のマングリングの克服
主なハードルは、名前のマングリングから発生します。 C で使用される規則。これらの規則により、C コードが C シンボルを直接参照することが困難になり、未解決のシンボル エラーが発生します。
これを克服するための一般的なアプローチには、C の機能をラップする C API を作成することが含まれます。この API は、C クラスやオブジェクトを使用せずに必要な機能を公開する純粋な C コードで構成されています。オブジェクト指向スタイルに従うことで、API は C コードと対話するための使い慣れたインターフェイスを提供できます。
実装例
C API のアプローチは次のとおりです。実際の実装:
// *.h file #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
// *.cpp file 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 API は作成する関数のセットを提供します。 MyType 型のオブジェクトを破棄および操作し、C クラスとオブジェクトの実装の詳細を舞台裏に隠します。
以上がC コードはどのようにして C 機能にアクセスできるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。