私はCで書かれたいくつかの関数をC++プロジェクトに組み込もうとしています。私はかなり先にthese命令に従った。 残念ながら、私が呼び出す必要があるC関数のすべてがcヘッダファイルで宣言されているわけではありません。いくつかは ".c-files"内で定義された静的関数です。C関数をCヘッダに宣言されていないC++プロジェクトにインポートするには?
Cソース(自分で管理していない)を変更せずに、このような「宣言されていないC関数」を私のC++プロジェクトのクラスから呼び出す方法はありますか?
私はすでにCは私のCに自分自身を機能++このようなヘッダの宣言についての前方に考えた:
extern "C"
{
#include "c_header_1.h"
static void c_function(int* out, const unsigned char len, const some_c_struct* st);
#include "c_header_2.h
}
gccが唯一のエラーを報告:
warning: void c_function(int*, const unsigned char, const some_c_struct*); declared static but never defined [-Wunused-function].
ポインタがに3番目のパラメータとして渡される構造体へc_function(int*, const unsigned char, const some_c_struct*)
は、さらに型を変えるようです。そのタイプはsome_c_struct
で、 ".c-file"に属するヘッダの中で宣言されているので、c_function(...)
も宣言されています。これは、前方宣言の前にc_function(...)
のヘッダーを含める必要があることを意味しますが、これによりリンカーは定義を監督します。
C++コードは大体この見えるのは非常にsimplyfiedバージョン: ヘッダーファイル "CppClass.h":
#ifndef CPP_CLASS_H
#define CPP_CLASS_H
extern "C"
{
#include "c_header_1.h"
#include "c_header_2.h"
...
}
class CppClass
{
public:
//...
void some_member();
//...
};
#endif
実装 "CppClass.cpp"
//...
void CppClass::some_member()
{
//...
::c_func_x(32, &data); // call to function in c_header_1
//...
::c_func_y(&data2); // call to function in c_header_2
::c_function(data3, len, st);
}
'static'関数は、定義されているモジュールの内部にあります。外部からそれらに到達することはできません。 – melpomene
@melpomeneまさに。それがCから呼び出されるべきでないなら(それはおそらく 'static'の理由です)、C++から呼び出し可能なのはなぜですか?そして:Cヘッダファイルに 'static'を置くことは決してありません。それはナンセンスです。 – tofro
翻訳単位(yuck)に.cファイルを '#include 'し、そのパラダイムの外側にコンパイルしないように計画していない限り、それらの静的関数はあなたのものまで存在しません。 cppファイルが関係しています。しかし、それは、あなたの特定のケースの外見による恐ろしい選択です。 – WhozCraig