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

adk*_*adk 5 c c++ pointers

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

Jas*_*n D 10

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

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

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

  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);
    }