私はC++ライブラリをCでラップすることに取り組んでいます.C++ライブラリはデータベースサーバのライブラリです。シリアライズされたデータを渡すためのラッパークラスを使用します。私はCで直接そのクラスを使用することはできませんので、私は、このようなCのコードで使用することができます構造体定義された:スタックに不完全な型を割り当てよう
extern "C" {
typedef struct Hazelcast_Data_t Hazelcast_Data_t;
Hazelcast_Data_t *stringToData(char *str);
void freeData(Hazelcast_Data_t *d);
}
(これは私のCラッパーのクライアントが含めているラッパーである)
include/c-wrapper/c-wrapper.h
で
をimpl.pp
extern "C" struct Hazelcast_Data_t {
hazelcast::client::serialization::pimpl::Data data; // this is the C++ class
};
Hazelcast_Data_t *stringToData(char *str) {
Data d = serializer.serialize(str);
Hazelcast_Data_t *dataStruct = new Hazelcast_Data_t();
dataStruct->data = d;
return dataStruct;
}
...
で
さて、これは私のCライブラリのクライアントのみtypedef struct Hazelcast_Data_t Hazelcast_Data_t;
を見て、動作します。問題は、前述のタイプがスタックに割り当てることができないこと、のような私はこのようなAPIを提供したいと考えている場合:
// this is what I want to achieve, but Hazelcast_Data_t is an incomplete type
#include <include/c-wrapper/c-wrapper.h>
int main() {
char *str = "BLA";
Hazelcast_Data_t d;
stringToData(str, &d);
}
コンパイラはHazelcast_Data_tが不完全な型であるというエラーがスローされます。私はまだHazelcast_Data_t
のスタック割り当て参照を直列化関数に渡すことができるAPIを提供したいと考えていますが、Hazelcast_Data_t
にはC++クラスへのポインタがあるため、これはほとんど不可能です。しかし、スタックに割り当てられた参照を渡すオプションがあると、Cライブラリのクライアントのコードが大幅に簡略化されます(new
構造を解放する必要はありません)。
Hazelcast_Data_t
タイプを再定義してCで使用できるようにしても、スタックに割り当てられるのは何とかできますか?
Hazelcast_Data_tには実際にC++クラスへのポインタが含まれていますか、または実際のC++構造体またはクラスオブジェクトが含まれていますか?実際にはポインタだけの場合、ポインタのサイズは不完全な型であってもよく知られているので、多くの問題はありません(システムによっては、常に4または8バイトです)。 Cコンパイラが理解しやすいようにポインタを(void *)として保存しなければならないかもしれませんが、その外ではなぜ問題になるのかわかりません。 –
@JeremyFriesner Hazelcast_Data_tには実際のデータが含まれています。また、voidポインタを使うこともできると思っていましたが、 'Hazelcast_Data_t data'を' void * 'にキャストすることはできず、ローカルのスタック変数であるためアドレスを取得できません。 – Max
閉じるように投票した人:私の質問で何が尋ねられているのか明確でない理由を理解するのを助けてください。私はまだC/C++プログラミングの新人で、問題を解消するために間違った言葉を使ったかもしれません。理由が「不明」で終わると投票することは、まったく役に立たない。 – Max