字符串的C ++问题

时间:2015-10-12 00:02:25

标签: c++ c string include

我正在使用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 ++的新手,所以我感谢任何帮助。谢谢!

1 个答案:

答案 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文件中