0

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_structc_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);
}
4

2 に答える 2

1

明確な答え: いいえ。翻訳単位 (通常は .c または .cpp ファイル) で静的に宣言された関数は、正しい関数シグネチャを前方宣言したとしても、他の場所にはアクセスできません。

厄介な答え、お勧めしません: # 問題のある .c ファイルを .cpp ファイルに含めて、それが機能するかどうかを確認してください。ただし、これはハックだと思います。実装ファイルには、その名前が示すとおり、インターフェイスではなく実装が含まれています。これは通常、内部で何が起こっているかを知る必要がなく、バージョン間で変更される可能性があることを意味します.

ソースを管理している人物を知っている場合は、彼に連絡して、その関数をパブリック インターフェイスの一部にすることができるか (つまり、ヘッダーに入れて非静的にするか) 尋ねてみることもできます。

于 2016-08-21T07:47:23.587 に答える
0

関数を新しいファイルにコピーすることをお勧めします。それらを静的にしないでください。それらのヘッダー ファイルを作成し、それを cpp に含めます。

于 2016-08-21T07:58:00.970 に答える