在c文件中使用C++类
我需要使用mbed api,但仅限于使用C.如何在c文件中使用例如SPI类。从网上查找使用C++类,你应该在C++中创建一个包装函数,但正如我所说的,我不能使用C++,是他们的另一种解决方法吗?在c文件中使用C++类
如何在c文件中使用例如SPI类。
不能在C.
使用类†从寻找在网上使用C++类,你应该在C上创建一个包装函数++
这是正确的。
是他们另一种解决方法吗?
号但说我不能使用C++
那么你跳出选项(至于标准而言)。一个C++ API(包含类和所有东西)不能在C中使用。可以创建一个只使用两种语言共享的特性的包装器接口(不包括所有OOP内容)。
该包装接口只能在C++中实现,因为它必须与它所包装的接口进行交互。如果包装可以在C中实现,那么就不需要它了。一旦包装接口被实现,它可以从C.
可以使用其它的一些要点:
- 如果库使用C++,然后
main
必须在C++实现。那main
也可以是C函数的一个简单的包装器,可以从C++调用而不用大惊小怪。 - 必须链接C++库,的依赖关系,其可以包括C++标准库
实施例:
C++ API
// interface.hpp
class C {
public:
std::string str;
};
C包装为API
// 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结构兼容。
*理论上讲,如果你知道成员的名称是错误的,你可以实例化和使用纯C的C++类。但如果它使用任何标准容器或其他库,那么它可能会失败壮观。 –
@Bartek Banachewicz - Bartek - 这是一个黑客不是理智的解决方案 –
任何人都可以表达如何编译这些代码与GCC和G + +? – EsmaeelE
答案很简单 - 使用mbed涉及使用C++。
如果您必须在C中编程忘记mbed并编写您自己的SPI库或使用目标硬件的许多可用库(框架)之一。
有没有其他办法
“没有别的办法”是错误的。答案没有提供任何例子,所以它几乎没用。 – Fabien
如果仅限于用C ...只是使用C和编译为C++文件。大多数代码应该兼容。
创建一个*函数作为该类的接口,并使用'extern“C”'。 https://*.com/questions/1041866/in-c-source-what-is-the-effect-of-extern-c – Jepessen
你不能在C中直接使用C++的东西。你需要编写一个C接口包装器首先为C++代码。 – VTT
@Jepessen,但这并不适用于我认为 – homeGrown