关于将指针从C程序传递到C++库并返回的结构, double 函数,函数……,有什么技巧可以给我?

最佳答案

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

  • 它们使用相同的编译器进行编译。如果所有的C++导出都以C样式的命名约定导出,则这不是必需的,但是C++到C++的调用需要在两个C++模块之间的类实例。由于不同的编译器如何处理C++的导出方式不同,因此这是必需的。
  • 不要将C++类转换为C结构。即使字段的布局相同,它们的内幕也不一样。如果C++类具有任何虚拟成员,则它们具有“v表”。此v表允许正确调用继承的或基类的方法。
  • 从C到C或C++到C++以及C到C++都是如此。确保两者对输出库使用相同的字节对齐方式。您只能通过阅读编译器或开发环境文档来确定这一点。
  • 不要将malloc/free与new/delete混合使用。更具体地说,不要分配带有“free”的新内存和可用内存,反之亦然。两者之间,许多编译器和操作系统对内存管理的处理方式不同。
  • 传递函数指针:只要它们以“extern“C””的形式从C++公开/从C++公开,就可以了。 (您可能需要引用编译器文档,以了解如何确定何时将 header 编译为C或C++以便将其维护在一个文件中,或者在每个项目中都需要同一函数声明的两个单独的拷贝-我推荐第一个)
  • 传递 double :这是C和C++中的内置类型,应以相同的方式处理。
  • 如果必须与C函数共享C++对象的实例,然后从C代码中对其执行操作,请公开一组C导出的帮助器函数,这些函数在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); }

    关于c++ - 将指针从C传递到C++,反之亦然,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2076209/

    10-11 18:10