ホームページ >バックエンド開発 >C++ >C コードから C 関数を呼び出し、名前のマングリングの問題を回避するにはどうすればよいですか?

C コードから C 関数を呼び出し、名前のマングリングの問題を回避するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-25 01:58:13871ブラウズ

How Can I Call C   Functions from C Code and Avoid Name Mangling Issues?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。