在c文件中使用C++类

在c文件中使用C++类

问题描述:

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

+1

创建一个*函数作为该类的接口,并使用'extern“C”'。 https://*.com/questions/1041866/in-c-source-what-is-the-effect-of-extern-c – Jepessen

+2

你不能在C中直接使用C++的东西。你需要编写一个C接口包装器首先为C++代码。 – VTT

+0

@Jepessen,但这并不适用于我认为 – homeGrown

如何在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结构兼容。

+0

*理论上讲,如果你知道成员的名称是错误的,你可以实例化和使用纯C的C++类。但如果它使用任何标准容器或其他库,那么它可能会失败壮观。 –

+2

@Bartek Banachewicz - Bartek - 这是一个黑客不是理智的解决方案 –

+0

任何人都可以表达如何编译这些代码与GCC和G + +? – EsmaeelE

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

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

有没有其他办法

+1

“没有别的办法”是错误的。答案没有提供任何例子,所以它几乎没用。 – Fabien

如果仅限于用C ...只是使用C和编译为C++文件。大多数代码应该兼容。

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

+0

看起来正是我需要的。他们的任何例子都是如何在臂板上(st) – homeGrown

+0

'spi_t spi; spi_init(&spi,SPI_MOSI,SPI_MISO,SPI_SCK,SPI_NSS); spi_frequency(&spi,4000000);/*等* /'您的电路板的正确实施将自动加载。 –

+0

它是如何自动加载的? – homeGrown