我想只有2个extern C函数,它们是如何与API交互的。然后在静态.lib里面,我想让我的班级完成所有的工作。但它不应该在外面可见。
我可以通过在编译单元中将它们声明为静态来使用纯C函数来完成它,但是我如何用类来完成呢?
答案 0 :(得分:2)
如果我理解你的问题:
如果是这种情况,诀窍就是使用 unamed namespace :
在你的图书馆资源中你会有这样的东西:
namespace { // anonymous
class U { // class visible only to the library
public:
int y;
U() :y(0) { cout << "U\n"; }
void mrun() { y++; }
};
}
void f() {
U x;
...
}
然后,您可以使用来自世界各地的图书馆:
extern void f(); // declare the function (in a header)
f(); // invoke the function
即使辅助类将在外部世界声明:
class U { public: int y; U(); void mrun(); };
如果想要使用U,则无法使用和链接错误。这是因为未命名的命名空间对每个编译单元都是唯一的。
如果您使用相同类型的解决方案但没有匿名命名空间,则辅助类将可见并且链接将成功。
答案 1 :(得分:1)
也许您可以使用C函数镜像该类的API,如下所示:
class Cpp
{
int i = 0;
public:
int get_i() { return i; }
void set_i(int i) { this->i = i; }
};
// C code has a void* as a handle to access
// the correct instance of CPP
extern "C" void* new_Cpp()
{
return new Cpp;
}
extern "C" void delete_Cpp(void* cpp)
{
delete reinterpret_cast<Cpp*>(cpp);
}
extern "C" int Cpp_get_i(void* cpp)
{
return reinterpret_cast<Cpp*>(cpp)->get_i();
}
extern "C" void Cpp_set_i(void* cpp, int i)
{
return reinterpret_cast<Cpp*>(cpp)->set_i(i);
}