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