[解決済み] CコードでのC++ライブラリの使用
2022-10-08 08:36:14
質問
データを管理するための様々なクラスを提供するC++ライブラリがあります。 私はライブラリのソースコードを持っています。
私は、ライブラリがCコードとC++コードを同時に使用できるように、C++ APIを拡張してC関数呼び出しをサポートしたいと思います。
私はGNUツールチェーン(gcc、glibcなど)を使用しているので、言語とアーキテクチャのサポートは問題ではありません。
というのは何か理由があるのでしょうか? 技術的に は不可能なのでしょうか?
何か があるのでしょうか? はありますか?
この件に関するリソース、サンプルコード、ドキュメントがありますか?
その他、わかったことをいくつか。
- C コードで使用する必要がある C++ ヘッダーをラップするには、以下を使用します。
#ifdef __cplusplus
extern "C" {
#endif
//
// Code goes here ...
//
#ifdef __cplusplus
} // extern "C"
#endif
-
本当の C++ インターフェイスは、C に含まれない別のヘッダファイルに保存してください。
PIMPLの原則
を考えてみてください。 使用方法
#ifndef __cplusplus #error
のようなものを使うと、どんなおかしなことでも検出することができます。 - C コードで名前として C++ 識別子を使用する場合の注意点
- C コンパイラと C++ コンパイラの間で異なるサイズの列挙。 GNU ツールチェーンを使用している場合は、おそらく問題にはなりませんが、それでも注意が必要です。
-
構造体については、Cが混乱しないように、以下の形式に従ってください。
typedef struct X { ... } X
-
そして、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++クラスを公開する必要がある場合、この単純な関数の例よりも多くの作業を行う必要があるかもしれません。
関連
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】C++の余分な資格エラー
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] C言語とC++の両方で有効なコードを、それぞれの言語でコンパイルすると、異なる動作になることがありますか?
-
[解決済み] なぜGCCは、速度の代わりにサイズに最適化すると、15-20%速いコードを生成するのですか?
-
[解決済み】スタティックリンクとダイナミックリンクの比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない