0

今、私は C インターフェイスを持つことが期待される C++ ライブラリを開発しています。そのためには、次の 2 つの解決策があります。

解決策 1:

lib_c_header.h
lib_c_header_imp.cpp

解決策 2:

lib_c_header.h
  lib_c_header_imp.c

それから私が持っている最初の質問は、C インターフェイス ヘッダーと C++ 実装ファイルを C++ ライブラリのラッパーとして持つことは有効ですか?

次に、2 番目のソリューションに移り、C インターフェイス ヘッダーと C 実装ファイルを作成します。C 実装ファイルでは、ライブラリの C++ クラスが呼び出されます。ただし、これを行うと、常に cmath 構文エラーが発生します。

c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\cmath(19): error C2061: syntax error : identifier 'acosf'

これらのエラーにより、cmathファイル内の次のコードが表示されます。

_STD_BEGIN
using _CSTD acosf; using _CSTD asinf;
using _CSTD atanf; using _CSTD atan2f; using _CSTD ceilf;
using _CSTD cosf; using _CSTD coshf; using _CSTD expf;
using _CSTD fabsf; using _CSTD floorf; using _CSTD fmodf;
using _CSTD frexpf; using _CSTD ldexpf; using _CSTD logf;
using _CSTD log10f; using _CSTD modff; using _CSTD powf;
using _CSTD sinf; using _CSTD sinhf; using _CSTD sqrtf;
using _CSTD tanf; using _CSTD tanhf; 

lib_c_header_imp.cこの問題は、実装ファイルが C ファイルとしてコンパイルされ、ファイル内でいくつかの C++ クラスが呼び出されるという事実に起因すると思います。この問題の解決策があるかどうか疑問に思っていました。ありがとう。

4

2 に答える 2

3

extern "C"C++ を呼び出す C 関数を記述する唯一の方法は、ブロック内で C++ でコンパイルすることです。関数の本体は依然として C++ でなければならないためです。だからあなたは持っている必要がありますlib_c_header_imp.cpp

C ラッパーと完全な C++ インターフェイス用に個別のヘッダーを使用するか、C++ 部分を#ifdef __cplusplus. 大きさや使用頻度などによって異なります。

ヘッダーには、C ヘッダーのみ (つまり<math.h>、 ではなく<cmath>) を含めるか、C++ ヘッダーを の下#ifdef __cplusplusに含めることができますが、明らかにそれらのコンテンツを C ラッパー部分で使用することはできません。

于 2013-08-07T08:58:31.600 に答える
0

通常、C++ に C を含めることができます。つまり、ソースをコンパイルするときに C++ コンパイラを使用します。ただし、C コンパイラを使用して C++ コードをコンパイルすることはできません。

于 2013-08-07T08:58:23.573 に答える