我一直在为我的项目编写一个库(现在我正在使用Arduino)。我遇到的问题是C ++和Arduino中的string
不同。
也就是说,我希望我的图书馆独立于Arduino,所以我使用#include <string>
并稍后声明string s;
。但是在Arduino中,字符串由Arduino定义并声明为String s2
。
当我将我的库包含到草图中时,我会在我尝试包含C ++字符串库(error: string: No such file or directory
)的行上获得#include <string>
。
有没有办法让Arduino使用C ++字符串库,或者在编译时将字符串转换为Arduino字符串?
答案 0 :(得分:10)
有几件事:
char *
指向一组字符。std::string
库的源代码。执行#include <string>
是不够的:您还必须为AVR平台编译字符串库。new
和delete
未实现。此外,std::string
实现可能还需要其他东西,因此要管理很多依赖项,或者Arduino的代码源大小太大。对于像Arduino这样的AVR微控制器,有一些经典的字符串工具的实现,但它们是以程序的方式(而不是以面向对象的方式)为C风格的字符串完成的。例如,对于随avr-gcc一起提供的avr-libc,您可以在此处查看功能列表:
avr-libc string.h
您甚至拥有优质的printf
:avr-libc stdio.h
如果在代码中添加好的头文件,可以将它们与Arduino一起使用,但要注意代码的大小!仅使用printf
可以将大小增加几千字节,这对于微控制器来说可能是巨大的,具体取决于您的需求。
总而言之,在我看来,唯一可移植的方法是使用char *
字符串,http://arduino.cc/en/Reference/String
答案 1 :(得分:2)
新的SafeString Arduino库(可从库管理器中获得)使您可以使用“字符串”类型的操作,而无需使用新建/删除操作。 有关详细的教程,请访问: https://www.forward.com.au/pfod/ArduinoProgramming/SafeString/index.html
尽管该库使用Arduino接口(例如Print和Stream)。可以直接将它们剥离,并使该库成为独立于Arduino的“标准” C ++库。