Jas*_*n D 10
假设你在静态或动态的两个不同的库中编码这些(Linux上的Windows共享库上的DLL和其他*nix变体)我最关心的问题如下:
它们使用相同的编译器进行编译.如果所有C++导出都以C样式命名约定导出,则不需要这样做,但是必须对两个C++模块之间的类实例进行C++到C++调用.这是必要的,因为不同的编译器以不同的方式破坏C++导出.
不要将C++类转换为C结构.它们在封面下是不一样的,即使字段的布局是相同的.如果C++类有任何虚拟成员,它们就有一个"v-table"; 这个v表允许正确调用继承或基类方法.
对C到C或C++到C++以及C到C++都是如此.确保两者对输出库使用相同的字节对齐方式.您只能通过阅读编译器或开发环境文档来确定这一点.
不要将malloc/free与new/delete混合使用.更具体地说,不要使用"free"分配带有新内存和空闲内存的内存,反之亦然.许多编译器和操作系统在两者之间以不同方式处理内存管理.
传递函数指针:只要它们作为''extern"C"''暴露于/来自C++,这应该没问题.(您需要参考编译器文档,了解如何确定何时将头编译为C或C++以将其保存在一个文件中,或者您需要在每个项目中使用相同函数声明的两个单独副本 - 我推荐第一个)
传递双精度:这是C和C++中的内置类型,应该处理相同.
如果必须与C函数共享C++对象的实例,并在C代码中对其执行操作,则公开一组C-exported帮助函数,这些函数调用C++对象上的相应方法.纯C代码无法正确调用C++对象上的方法.
Pseudocode-ish Example:
// C++ class
class foo {
public:
void DoIt();
};
// export helper declarations
extern "C" void call_doit(foo* pFoo);
extern "C" foo* allocate_foo();
extern "C" deallocate_foo(foo* pFoo);
// implementation
void call_doit(foo* pFoo)
{
pFoo->DoIt();
}
foo* allocate_foo()
{
return new foo();
}
deallocate_foo(foo* pFoo)
{
delete pFoo;
}
// c consumer
void main()
{
foo* pFoo= allocate_foo();
call_doit(pFoo);
dealocate_foo(pFoo);
}
| 归档时间: |
|
| 查看次数: |
1283 次 |
| 最近记录: |