2017-02-14 15 views
2

私はC++には新しく、GUIとHMIを含む産業用ソリューションで作業しています。 このソリューションはC++で開発されたもので、Hillstar Development Kit(ジェスチャー認識用)とC++ソリューションをインターフェースするように求められました。 Hillstarライブラリ(GestIC)とすべての例はC言語で開発されています。 私の質問は、これらのGestICライブラリをC++ソリューションに実装する方法です。C++ソリューションを使用したCライブラリ

ありがとうございます。

+4

C++コードはCライブラリを呼び出すことができます - 何が問題なのですか? –

+1

そのまま使用してください。確実にするべきことは、cヘッダに 'extern c 'がない場合は、ファイルに追加する必要があることです。 –

+0

スタックオーバーフローへようこそ!質問を編集して[これまでに試したこと](http://whathaveyoutried.com)を表示してください。問題のあるコードの[mcve]を含める必要があります。次に、特定の問題を解決するために役立つことができます。 [ask]も読んでください。 –

答えて

5

C++を介して、それらを宣言することによって、C関数を呼び出すために用意されています、あなたはその後、CからあなたのC関数を呼び出すことができます

extern "C" { 
    #include "my-C-code.h" 
} 

++ C.からあなたが行うのと同じ方法でこれはC++の名前の符号化そうだろう防ぎリンクエラーが発生します。これは本質的に、Roonyが振り返りながら提案したものです。しかしあまり秘密ではない。彼が指摘しているように、Cファイルにすでにこの文がある場合は、これを行う必要はありません。 C++コンパイルを認識するプリプロセッサの#ifdef文を使用します。この指定子は、名前のマングリングを無効にします。そして、関数定義と本体だけに使用されます(ただし、プリプロセッサ指令を妨げません)。他のほとんどのCコードはC++のように動作するようです。このexternに含まれるいくつかのCヘッダーは、コンパイルされません。特に、予約されたC++キーワードの名前を持つ関数を持つものがコンパイルされます。

詳細については、"mixing c and cpp"を参照してください。「C++コードに非システムCヘッダーファイルを含めるにはどうすればよいですか」セクション。

3

C++でのC関数の使用に問題はありません。あなたは、特定のライブラリ関数を呼び出すラッパーを書くことができます。

+0

C++からCを呼び出すにはラッパーが必要ですか? CからC++を呼び出すためのラッパーを書く必要があるのは分かりますが、それ以外の方法はありますか? –

+0

これはクリーナーになります。C++ソリューションとCライブラリをどのようにインターフェイスする必要があるかによって異なります(使用するオブジェクトによって異なります) – Gnqz

+0

ご連絡いただきありがとうございます。しかし、私は私に新しいC++を言ったように、 は、ラッパーを書く方法を説明して、チュートリアルの方向を教えてくれますか? thx – OneManArmy

1

他のすべてのものと同様に含まれます。

#include "your library" 

これで使用できます。

+2

動作しない可能性があります(CライブラリがC++を認識していない場合はほとんどありません)。 C++の名前のマングリングのためです。 – axalis

+2

@axalis:Cライブラリは*「C++対応」*である必要はありません(とにかく、C++が発明される前にC++の意識をどのように実装しましたか?)。そのまま呼び出し可能です。バイナリをリンクする必要があるプリコンパイルされたバイナリを持っている場合にのみ、Cの名前の装飾(例えば、 'extern" C "'を使って)に対応する必要があります。 – IInspectable

+3

@Inspectable:プリコンパイルされたバイナリを持っていなくても、CソースコードをC++ではなくC言語としてコンパイルする必要があります。 CとC++の共通サブセットにコードを書くことは可能ですが、* C * Cのように書かれています。 "C++ aware"ライブラリは、ヘッダファイル自体に '#ifdef __cplusplus extern" C "{" 'ガードを持つライブラリです(その答えがうまくいくので、私はこれまでにほとんどのCライブラリを使っています)。 –

関連する問題