我正在使用cpp和h文件进行一些arduino开发,我在使用字符串时遇到了一些麻烦。目前我有
#include <string>
位于cpp和h文件的顶部。当我这样做时,它给了我错误:
string: no such file or directory
如果我进入h文件并将其更改为
#include <string.h>
然后它给了我错误:
std::string has not been declared
我随时使用我使用的字符串:std :: string来声明它。我没有使用命名空间std,在我开始尝试使用字符串之前,这些文件正在合作。我是C / C ++的新手,所以我感谢任何帮助。谢谢!
答案 0 :(得分:2)
简而言之,有一种方法可以将std::string
与Arduino一起使用。
TL; DR: link to the arduino STLv1.1.2
请注意,目前这个STL提供的harrdwareserialstream类应该被认为是破坏的(根据我的测试,IDE的1.6.5版本,以及1.0.6之后的任何东西)。因此,你不能使用
hardwareserialstream << "Hi there person number " << (int)i
等等。它似乎不再工作,因为它引用了它将与之交互的串口而不是指针 - 简而言之,继续使用
Serial.print("Hi there person number");
Serial.print((int)i);
最后,序列类不知道std::string
是什么,所以如果使用它们,请改为std::string.c_str()
正如McEricSir在评论中所说,arduino确实提供了自己的字符串类,虽然我发现它存在与内存泄漏有关的问题,最终吃掉了我所拥有的所有内存并且程序停止运行 - 尽管这是在arduino IDE v 1.0.5中,它可能已经修复了。
我遇到了同样的问题,发现有人创建了STL for the arduino的版本(这是对Andy Brown的道具),这是SGI STL的缩减版本。它为arduino提供了std :: string,std :: vector和大量的STL。
使用它时有一些事情需要注意;如果您的电路板内存很少,您可以使用智能容器和其他高级功能快速填充它。
要使用该库,您需要阅读该文章,不过我将在此总结您的主要观点:
只需将库提取到(假设您使用的是标准的Arduino IDE)hardware\tools\avr\avr\include
文件夹,就可以了。
要实际使用新库,您需要包含2个附加内容以及所需的库。
首先,您需要包含标题iterator
BEFORE 来自此STL的所有库 - 以及您引用STL的每个文件。
其次,您还需要包含文件pnew.cpp
,以便为要使用的STL提供new
运算符的实现。
最后,像往常一样包含任何头文件。
要使用从中获取的类型,请不要忘记它们的std::
命名空间表示法。 (std::string
等等)
自Andy发布图书馆以来,已经有两个错误(我知道)。
第一个安迪自己在博客文章中纠正和解释:
编译器会吐出一个典型的模糊错误连续的错误,关键错误就是这个错误:
dependent-name
,请说std::basic_string::size_type
被解析为非类型, 但实例化产生类型c:/ program files(x86)/arduino-1.0/ hardware / tools / avr / lib / gcc /../../ avr / include / string:1106:注意: 如果类型是typename std::basic_string::size_type
基本上,STL是很久以前编写的,当时C ++编译器对从模板继承的依赖类型稍微宽容一些。这些天他们更严格,你被迫明确表示你的意思是使用typename关键字的类型。
此外,他还提供了更新版本供您使用。
最后,评论中有关于有关矢量类的IDE的较新版本中的错误的报告,其中编译器抱怨使用_M_deallocate
而没有前置this->
,你如果你在矢量类中搜索它们可以修复
由于我经常使用这个,我打包了当前版本,can be found here(这包括我评论的两个修补程序)
使用此功能时,请务必留意您的空闲记忆,为此,我建议您选择优秀的课程MemoryFree Library found here
如果您在标题中#include<string>
,则在侧边注释中不需要将其包含在相关的.cpp文件中