C++ class 的 C 包装器不起作用
C wrapper for a C++ class not working
我有一个公开一些 API(通过 cppH.h)的 C++ 库,它是一个静态库 (*.lib)。
我想在 C 代码中使用它,因此编写了一个 C Wrapper,如下所示。但是,我收到如下构建错误。请在这方面帮助我知道我错过了什么。我参考了 here
cppH.h - C++ 库的头文件
class Abc
{
int ma, mb;
public:
void pass(int a,int b);
int sum();
};
CWrapper.h
#ifdef __cplusplus
extern "C" {
#endif
typedef struct Abc_C Abc_C;
Abc_C* New_Abc();
void pass_in_C(Abc_C* cobj, int a, int b);
int sum_in_C(Abc_C* cobj);
#ifdef __cplusplus
}
#endif
CWrapper.cpp
#include "CWrapper.h"
#include "cppH.h"
extern "C" {
Abc_C* New_Abc()
{
return new Abc_C();
}
void pass_in_C(Abc_C* cobj, int a, int b)
{
cobj->pass(a, b);
}
int sum_in_C(Abc_C* cobj)
{
cobj->sum();
}
}
CWrapper.cpp & CWrapper.h statically links to the C++ library cppH.lib
& cppH.h.
编译错误:
1>------ Rebuild All started: Project: CApp, Configuration: Debug Win32 ------
1> CS.c
1> CWarpperS.cpp
1>c:\users\user1\documents\ccg\vsprojects\expapp\capp\cwarppers.cpp(7): error C2512: 'Abc_C' : no appropriate default constructor available
1>c:\users\user1\documents\ccg\vsprojects\expapp\capp\cwarppers.cpp(12): error C2027: use of undefined type 'Abc_C'
1> c:\users\user1\documents\ccg\vsprojects\expapp\capp\cwrapper.h(6) : see declaration of 'Abc_C'
1>c:\users\user1\documents\ccg\vsprojects\expapp\capp\cwarppers.cpp(12): error C2227: left of '->pass' must point to class/struct/union/generic type
1>c:\users\user1\documents\ccg\vsprojects\expapp\capp\cwarppers.cpp(17): error C2027: use of undefined type 'Abc_C'
1> c:\users\user1\documents\ccg\vsprojects\expapp\capp\cwrapper.h(6) : see declaration of 'Abc_C'
1>c:\users\user1\documents\ccg\vsprojects\expapp\capp\cwarppers.cpp(17): error C2227: left of '->sum' must point to class/struct/union/generic type
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
类型 class Abc
和 struct Abc_C
(无处定义)完全无关。你在 C header 中的 typedef 是错误的。它是未定义类型的别名。因此 new Abc_C();
正在尝试创建一个不完整类型的 object。
一个简单的解决方法是按如下方式更改别名:
typedef struct Abc Abc_C;
现在别名是正确类型的名称。
我有一个公开一些 API(通过 cppH.h)的 C++ 库,它是一个静态库 (*.lib)。 我想在 C 代码中使用它,因此编写了一个 C Wrapper,如下所示。但是,我收到如下构建错误。请在这方面帮助我知道我错过了什么。我参考了 here
cppH.h - C++ 库的头文件
class Abc
{
int ma, mb;
public:
void pass(int a,int b);
int sum();
};
CWrapper.h
#ifdef __cplusplus
extern "C" {
#endif
typedef struct Abc_C Abc_C;
Abc_C* New_Abc();
void pass_in_C(Abc_C* cobj, int a, int b);
int sum_in_C(Abc_C* cobj);
#ifdef __cplusplus
}
#endif
CWrapper.cpp
#include "CWrapper.h"
#include "cppH.h"
extern "C" {
Abc_C* New_Abc()
{
return new Abc_C();
}
void pass_in_C(Abc_C* cobj, int a, int b)
{
cobj->pass(a, b);
}
int sum_in_C(Abc_C* cobj)
{
cobj->sum();
}
}
CWrapper.cpp & CWrapper.h statically links to the C++ library cppH.lib & cppH.h.
编译错误:
1>------ Rebuild All started: Project: CApp, Configuration: Debug Win32 ------
1> CS.c
1> CWarpperS.cpp
1>c:\users\user1\documents\ccg\vsprojects\expapp\capp\cwarppers.cpp(7): error C2512: 'Abc_C' : no appropriate default constructor available
1>c:\users\user1\documents\ccg\vsprojects\expapp\capp\cwarppers.cpp(12): error C2027: use of undefined type 'Abc_C'
1> c:\users\user1\documents\ccg\vsprojects\expapp\capp\cwrapper.h(6) : see declaration of 'Abc_C'
1>c:\users\user1\documents\ccg\vsprojects\expapp\capp\cwarppers.cpp(12): error C2227: left of '->pass' must point to class/struct/union/generic type
1>c:\users\user1\documents\ccg\vsprojects\expapp\capp\cwarppers.cpp(17): error C2027: use of undefined type 'Abc_C'
1> c:\users\user1\documents\ccg\vsprojects\expapp\capp\cwrapper.h(6) : see declaration of 'Abc_C'
1>c:\users\user1\documents\ccg\vsprojects\expapp\capp\cwarppers.cpp(17): error C2227: left of '->sum' must point to class/struct/union/generic type
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
类型 class Abc
和 struct Abc_C
(无处定义)完全无关。你在 C header 中的 typedef 是错误的。它是未定义类型的别名。因此 new Abc_C();
正在尝试创建一个不完整类型的 object。
一个简单的解决方法是按如下方式更改别名:
typedef struct Abc Abc_C;
现在别名是正确类型的名称。