C++ 将指针从C传递到C++;反之亦然

C++ 将指针从C传递到C++;反之亦然,c++,c,pointers,C++,C,Pointers,关于向结构、双精度、函数等传递指针,有没有什么建议可以给我。。。从C程序到C++库,并且返回 C和C++指针是相同的——指针基本指向内存块,而从C/C++中不改变。 您确实希望注意不要交叉堆类型——例如,不要在一个库中分配,也不要在可能有另一个堆或正在使用另一个运行时版本的库中取消分配(反之亦然) 您的意思是询问有关传递值或传递引用的问题吗?它可能有助于提供一个更具体的问题。 不要忘记使用外部“C”关键字 避免C++的问题 名字 不使用按引用传递参数类型,而是使用指针 假设您在两个不同的库(静

关于向结构、双精度、函数等传递指针,有没有什么建议可以给我。。。从C程序到C++库,并且返回

C和C++指针是相同的——指针基本指向内存块,而从C/C++中不改变。

您确实希望注意不要交叉堆类型——例如,不要在一个库中分配,也不要在可能有另一个堆或正在使用另一个运行时版本的库中取消分配(反之亦然)

您的意思是询问有关传递值或传递引用的问题吗?它可能有助于提供一个更具体的问题。

  • 不要忘记使用外部“C”关键字 避免C++的问题 名字
  • 不使用按引用传递参数类型,而是使用指针

假设您在两个不同的库(静态库或动态库(Linux上windows共享库上的DLL和其他*nix变体)中编写这些代码,我最大的顾虑如下:

  • 它们是用同一个编译器编译的。虽然这不是必需的,如果所有C++输出都以C风格命名约定导出,那么C++对C++调用到两个C++模块之间的类实例是必要的。这是因为不同编译器对C++输出的不同方式所必需的。

  • 不要将C++类作为C结构来强制转换。即使字段的布局相同,它们在封面下也不相同。C++类如果有任何虚拟成员,则有一个“V表”;此v表允许正确调用继承的或基类方法

    <>这是C到C++或C++到C++的真实情况。确保两者对输出库使用相同的字节对齐方式。您只能通过阅读编译器或开发环境文档来确定这一点

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

  • P>传递函数指针:只要它们被暴露于/从C++作为“外部”C’’,就可以了。(您可能需要参考编译器文件,以确定如何将标题编译成C或C++,以将其保存在一个文件中,或者您需要在每个项目中使用相同的函数声明的两个单独副本——我建议第一个)

    。 <> P>传递双倍:这是C和C++中的一种内置类型,应该处理相同。

    >P>如果你必须共享C++对象的一个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);
        }