将指针从C传递给C ++,反之亦然

是否有任何提示可以告诉我有关将结构,双精度,函数,…从C程序传递到C ++库并返回的指针?

假设你在静态或动态的两个不同的库中编码它们(Linux上的Windows共享库上的DLL和其他* nix变体)我最关心的问题如下:

  1. 它们使用相同的编译器进行编译。 如果所有C ++导出都以C样式命名约定导出,则不需要这样做,但是必须对两个C ++模块之间的类实例进行C ++到C ++调用。 这是必要的,因为不同的编译器以不同的方式破坏C ++导出。

  2. 不要将C ++类强制转换为C结构。 它们在封面下是不一样的,即使字段的布局是相同的。 如果C ++类有任何虚拟成员,它们就有一个“v-table”; 这个v表允许正确调用inheritance或基类方法。

  3. 对C到C或C ++到C ++以及C到C ++都是如此。 确保两者对输出库使用相同的字节对齐方式。 您只能通过阅读编译器或开发环境文档来确定这一点。

  4. 不要将malloc / free与new / delete混合使用。 更具体地说,不要使用“free”分配带有新内存和空闲内存的内存,反之亦然。 许多编译器和操作系统在两者之间以不同方式处理内存管理。

  5. 传递函数指针:只要它们作为”extern“C””暴露于/来自C ++,这应该没问题。 (您需要参考编译器文档,了解如何确定何时将头编译为C或C ++以将其保存在一个文件中,或者您需要在每个项目中使用相同函数声明的两个单独副本 – 我推荐第一个)

  6. 传递双精度:这是C和C ++中的内置类型,应该处理相同。

  7. 如果必须与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); } 
  • 不要忘记extern“C”关键字,以避免C ++重整名称的问题。
  • 不要使用传递引用参数类型但指针

C和C ++指针是相同的 – 一个指针基本上指向一个内存块,并且不会改变C / C ++。

您确实要小心不要跨越堆类型 – 例如,不要在一个库中分配并在可能具有另一个堆或使用另一个运行时版本的库中取消分配(反之亦然)。

您是否要询问有关传值或传递参考的问题? 提供更具体的问题可能会有所帮助。