C で記述されたいくつかの関数を C++ プロジェクトに含めようとしています。私はこれらの指示に従ってかなり遠くまで来ました。残念ながら、呼び出す必要のあるすべての C 関数が ac ヘッダー ファイルで宣言されているわけではありません。「.c-files」内で定義された単なる静的関数もあります。
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-file」に属するヘッダー内でc_function(int*, const unsigned char, const some_c_struct*)
その型が宣言されているため、物事をさらに複雑にしているようです。これは、前方宣言の前にヘッダーを含める必要があることを意味しますが、明らかにこれにより、リンカーが定義を監視します。some_c_struct
c_function(...)
c_function(...)
非常に単純化されたバージョンの C++ コードは、大まかに次のようになります。 ヘッダー ファイル "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);
}