代码之家  ›  专栏  ›  技术社区  ›  homeGrown

在C文件中使用C++类

  •  -2
  • homeGrown  · 技术社区  · 8 年前

    mbed api 但仅限于使用C。例如,我如何在C文件中使用SPI类。从在线查找到使用C++类,你应该在C++中创建一个包装函数,但正如我所说的,我不能使用C++,这是他们的另一种解决方法吗?

    4 回复  |  直到 8 年前
        1
  •  6
  •   eerorika    8 年前

    例如,如何在c文件中使用SPI类。

    不能使用类

    从联机查看到使用C++类,您应该在C中创建一个包装函数++

    这是正确的。

    那么你就别无选择了(就标准而言)。C++API(包含类和所有内容)不能在C中使用。可以创建一个包装器接口,该接口仅使用两种语言共享的功能(不包括所有OOP内容)。

    其他几点:

    • 如果库使用C++,则 main 必须用C++实现。那个 也可以是C函数的简单包装器,可以从C++中轻松调用。
    • 您必须链接C++库的依赖项,其中可能包括C++标准库

    C++API

    // interface.hpp
    class C {
    public:
        std::string str;
    };
    

    API的C包装器

    // wrapper.h
    struct C;
    struct C* makeC();
    void freeC(struct C*);
    void setStr(struct C*, char*);
    conts char* getStr(struct C*);
    

    包装器的实现(在C++中)

    extern "C" {
       #include "wrapper.h"
    }
    #include "interface.hpp"
    
    C* makeC()                   { return new C; }
    void freeC(C* c)             { delete c; }
    void setStr(C* c, char* str) { c->str = str; }
    const char* getStr(C* c)     { return c->str.c_str(); }
    

    C中的用法

    struct C* c = makeC();
    setStr(c, "test");
    puts(getStr(c));
    freeC(c);
    

    除非类定义及其所有子对象都不使用C++功能。然后它与相同的C结构兼容。

        2
  •  0
  •   Jan Jongboom    8 年前

    mbed HAL是用C编写的,因此您可以在不使用C++包装器的情况下使用它。E、 g.这是 hal/spi_api.h

        3
  •  -1
  •   0___________    8 年前

    答案很简单-使用

    如果你必须用C语言编程,忘了 并为您的目标硬件编写自己的SPI库或使用许多可用库(框架)中的一个。

    没有别的办法了

        4
  •  -1
  •   Mikolaj    8 年前

    如果你被限制使用C…只需使用C并将其编译为C++文件。Most代码应兼容。

    推荐文章