2016-08-20 5 views
0

私は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); 
} 
+6

'static'関数は、定義されているモジュールの内部にあります。外部からそれらに到達することはできません。 – melpomene

+0

@melpomeneまさに。それがCから呼び出されるべきでないなら(それはおそらく 'static'の理由です)、C++から呼び出し可能なのはなぜですか?そして:Cヘッダファイルに 'static'を置くことは決してありません。それはナンセンスです。 – tofro

+1

翻訳単位(yuck)に.cファイルを '#include 'し、そのパラダイムの外側にコンパイルしないように計画していない限り、それらの静的関数はあなたのものまで存在しません。 cppファイルが関係しています。しかし、それは、あなたの特定のケースの外見による恐ろしい選択です。 – WhozCraig

答えて

1

クリーン答え:いいえ。翻訳ユニット(通常は.cまたは.cppファイル)で静的と宣言された関数は、正しい関数signatを宣言してもure。

厄介な答えです。#違法な.cファイルを.cppファイルに含めて、動作するかどうか確認してください。私はこれをハックと考えています。実装ファイルには、その名前が意味するものが正確に含まれています。実装であり、インタフェースではありません。これは、通常、内部で何が起こっているのか、バージョン間で変更される可能性があることを知らされていないことを意味します。

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

0

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

関連する問題