在 c 文件中使用 C++ class

Use C++ class in a c file

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

How can I use for example a SPI class in a c file.

你不能在 C 中使用 class

From looking online to use C++ classes you should create a wrapper function in C++

这是正确的。

is their another way around this?

没有

but as stated I can't use C++

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

包装器接口只能在 C++ 中实现,因为它必须与它包装的接口进行交互。如果包装器可以用 C 实现,那么就不需要它了。一旦实现了包装器接口,就可以从 C 中使用它。

其他几点:

  • 如果库使用 C++,则 main 必须用 C++ 实现。 main 也可以是 C 函数的简单包装器,可以毫不费力地从 C++ 调用它。
  • 你必须linkC++库的依赖,其中可能包括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);

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

答案很简单 - 使用 mbed 涉及使用 C++。

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

别无他法

如果您仅限于使用 C... 只需使用 C 并将其编译为 C++ 文件即可。大多数代码应该兼容。

mbed HAL 是用 C 编写的,因此您可以在没有 C++ 包装器的情况下使用它。例如。这里是 hal/spi_api.h.