1. ホーム
  2. c++

[解決済み] CコードでのC++ライブラリの使用

2022-10-08 08:36:14

質問

データを管理するための様々なクラスを提供するC++ライブラリがあります。 私はライブラリのソースコードを持っています。

私は、ライブラリがCコードとC++コードを同時に使用できるように、C++ APIを拡張してC関数呼び出しをサポートしたいと思います。

私はGNUツールチェーン(gcc、glibcなど)を使用しているので、言語とアーキテクチャのサポートは問題ではありません。

というのは何か理由があるのでしょうか? 技術的に は不可能なのでしょうか?

何か があるのでしょうか? はありますか?

この件に関するリソース、サンプルコード、ドキュメントがありますか?


その他、わかったことをいくつか。

  1. C コードで使用する必要がある C++ ヘッダーをラップするには、以下を使用します。

#ifdef __cplusplus
extern "C" {  
#endif  
//  
// Code goes here ...  
//  
#ifdef __cplusplus  
} // extern "C"  
#endif

  1. 本当の C++ インターフェイスは、C に含まれない別のヘッダファイルに保存してください。 PIMPLの原則 を考えてみてください。 使用方法 #ifndef __cplusplus #error のようなものを使うと、どんなおかしなことでも検出することができます。
  2. C コードで名前として C++ 識別子を使用する場合の注意点
  3. C コンパイラと C++ コンパイラの間で異なるサイズの列挙。 GNU ツールチェーンを使用している場合は、おそらく問題にはなりませんが、それでも注意が必要です。
  4. 構造体については、Cが混乱しないように、以下の形式に従ってください。

    typedef struct X { ... } X
    
    
  5. そして、C++ オブジェクトの受け渡しにポインターを使用します。これらは、X が C++ オブジェクトである struct X として C で宣言されるだけです。

これらはすべて、C++のウィザードである友人の好意によるものです。

どのように解決するのですか?

はい、これは確かに可能です。C++でインターフェイス層を記述し、関数を extern "C" :

extern "C" int foo(char *bar)
{
    return realFoo(std::string(bar));
}

次に foo() を呼び出すと、C モジュールはその呼び出しを realFoo() 関数に渡します。

データメンバーとメソッドを持つ完全なC++クラスを公開する必要がある場合、この単純な関数の例よりも多くの作業を行う必要があるかもしれません。