在 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.
我需要使用 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.