You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从C调用使用内置C++类与模板的C++代码?

嘿,针对你的问题我来详细聊聊~ 不管是C与C的交互学习,还是Python和C直接对接的方案,都给你梳理清楚:

C与C++交互的实现思路(学习向)

因为C语言不识别C的面向对象特性、模板类(比如std::string、std::multiset)以及名字修饰规则,所以要实现两者交互,核心是给C代码提供一套兼容的C风格接口,把C的逻辑封装起来:

  • 用extern "C"包裹接口函数
    这一步是关键,它会告诉C++编译器不要对这些函数做名字修饰,让C代码能正确找到函数符号。比如封装std::string的示例:

    #include <string>
    extern "C" {
        // 创建std::string对象,返回通用指针给C代码
        void* create_string(const char* init_content) {
            return new std::string(init_content);
        }
    
        // 获取string的C风格字符串
        const char* get_string_content(void* string_ptr) {
            return static_cast<std::string*>(string_ptr)->c_str();
        }
    
        // 销毁std::string对象(必须由C++代码处理内存)
        void destroy_string(void* string_ptr) {
            delete static_cast<std::string*>(string_ptr);
        }
    }
    
  • 封装std::multiset的核心操作
    同样的思路,把multiset的插入、查找、遍历、销毁等操作都封装成C风格函数,用void*传递对象指针:

    #include <set>
    extern "C" {
        void* create_int_multiset() {
            return new std::multiset<int>();
        }
    
        void multiset_insert(void* ms_ptr, int value) {
            auto* ms = static_cast<std::multiset<int>*>(ms_ptr);
            ms->insert(value);
        }
    
        int multiset_count(void* ms_ptr, int value) {
            auto* ms = static_cast<std::multiset<int>*>(ms_ptr);
            return ms->count(value);
        }
    
        void destroy_multiset(void* ms_ptr) {
            delete static_cast<std::multiset<int>*>(ms_ptr);
        }
    }
    
  • 关键注意事项

    • 内存管理必须统一:C代码绝对不能直接用free()释放C对象,必须调用你提供的销毁函数;同理,C对象也不能用C的内存分配函数创建。
    • 接口中只能传递C兼容类型:比如基本类型、指针、C风格结构体,不要传递C++的引用、模板实例、类对象等。
Python与C++直接交互的实用方案

虽然你之前觉得C中转更可行,但实际项目里有更高效的直接对接方式,推荐几个常用的:

  • pybind11(首推)
    这是轻量级的C绑定库,支持C11及以上,不需要复杂的配置,能自动处理std::string、std::multiset这类STL容器和Python类型的转换。示例代码:

    #include <pybind11/pybind11.h>
    #include <pybind11/stl.h>
    #include <string>
    #include <set>
    
    namespace py = pybind11;
    
    PYBIND11_MODULE(mycppmodule, m) {
        // 绑定字符串处理函数
        m.def("process_str", [](const std::string& input) {
            return input + " [processed by C++]";
        });
    
        // 绑定multiset操作
        m.def("add_to_ms", [](std::multiset<int>& ms, int val) {
            ms.insert(val);
        });
    
        m.def("get_ms_size", [](const std::multiset<int>& ms) {
            return ms.size();
        });
    }
    

    编译成Python扩展模块后,直接在Python里import mycppmodule就能调用,非常方便。

  • Boost.Python
    老牌的绑定库,功能非常全面,适合复杂的大型C++项目,但依赖Boost库,编译和部署成本稍高。

  • Cython
    如果你熟悉Python的C扩展开发,Cython也可以通过声明C类和函数,生成中间代码编译成扩展模块,实现Python与C的对接。

内容的提问来源于stack exchange,提问作者user11332264

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:32:24