如何结合C++字符串和Arduino字符串?

Tau*_*das 12 c++ string arduino

我一直在为我的项目编写一个库(现在我正在使用Arduino).我string遇到的问题是在C++和Arduino中有所不同.

也就是说,我希望我的图书馆独立于Arduino,所以我正在使用#include <string>并随后宣布string s;.但是在Arduino中,字符串由Arduino定义并声明String s2.

当我将我的库包含到草图中时,我会error: string: No such file or directory尝试包含C++字符串库(#include <string>).

有没有办法让Arduino使用C++字符串库,或者在编译时将字符串转换为Arduino字符串?

Vin*_*ren 10

几件事:

  1. 我不确定你做独立于Arduino的事情的理由.通常,编程微控制器不是非常可调制的并且可能与经典计算机程序非常不同.如果你真的想要独立于任何微控制器和任何平台,你仍然可以使用C风格的字符串,char *指向一组字符.
  2. 做你想做的事情并不容易.首先,您需要std::string库的源代码.做一个#include <string>是不够的:你还必须为AVR平台编译字符串库.
  3. 还有一些"限制"的方式Arduino的过程中的C++代码与传统计算机程序相比:例如,经营者newdelete未实现.此外,std::string实现可能还需要其他东西,因此需要管理很多依赖项,或者Arduino的代码源大小太大.

对于像Arduino这样的AVR微控制器,有一些经典的字符串工具的实现,但是对于C风格的字符串,它们是以程序方式(而不是以面向对象的方式)完成的.例如,对于AVR-libc中使用GCC编译来了,你可以在这里看到的功能列表: AVR-libc的string.h中 你甚至可以历久弥新printf:AVR-libc的stdio.h中

如果在代码中添加好的头文件,可以将它们与Arduino一起使用,但要注意代码的大小!只需使用printf就可以将大小增加几千字节,这对于微控制器来说可能是巨大的,具体取决于您的需求.

总而言之,在我看来,唯一可移植的方法是使用char *字符串,http://arduino.cc/en/Reference/String

  • 使用C++,可以使用自动存储在堆栈上创建对象,而不使用堆.您只是在创建对象时不使用指针和"new".然后在范围的末尾自动删除对象,就像经典原语一样.使用Arduino,这就是为什么对象通常在全局范围内的任何函数之外创建,然后在setup()函数内初始化(在构造函数中很少完成,首选init()函数).然后可以在loop()函数中使用它们,而不必将任何指针引用传递给loop(). (5认同)