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

时间:2010-01-16 04:39:36

标签: c++ c pointers

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

3 个答案:

答案 0 :(得分:10)

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

  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 ++以将其保存在一个文件中,或者您需要在每个项目中使用相同函数声明的两个单独副本 - I推荐第一个)

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

  7. 如果必须与C函数共享C ++对象的实例,并在C代码中对其执行操作,则公开一组C-exported帮助函数,这些函数调用C ++对象上的相应方法。纯C代码无法在C ++对象上正确调用方法。

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

答案 1 :(得分:0)

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

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

你的意思是询问有关传值或传递参考的问题吗?提供更具体的问题可能会有所帮助。

答案 2 :(得分:0)

  • 不要忘记 extern“C”关键字 避免C ++重整问题 名称
  • 不要使用引用参数类型但指针