字符串的 C++ 问题
Posted
技术标签:
【中文标题】字符串的 C++ 问题【英文标题】:C++ problems with string 【发布时间】:2015-10-12 00:02:25 【问题描述】:我正在使用 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++ 新手,所以我很感激任何帮助。谢谢!
【问题讨论】:
你确定你有 C++ 平台吗? C 和 C++ 是两种不同的语言。这听起来像是使用 C 编译器将源代码编译为 C。<string.h>
是 C 头文件,不声明 std::string
。
可能是 C 我可能错了。如果我删除“std::”,那么它会说“尚未声明字符串”。我将如何使用字符串?
Arduino 既不是 C 也不是 C++,它是一种自定义语言,看起来有点像 C。它不支持任何 C++ 标准库。
@MrEricSir 如果可能的话,我将如何使用字符串?
【参考方案1】:
简而言之,有一种方法可以将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 在 cmets 中所说,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
之前来自此 STL 的任何库 - 并且在您引用 STL 的每个文件中。
其次,您还需要包含文件pnew.cpp
以提供new
运算符的实现,供STL 使用。
最后,像往常一样包含任何头文件。
要使用从它们获得的类型,不要忘记它们的std::
命名空间符号。 (std::string
等)
它的错误
自从 Andy 发布这个库以来,已经有两个错误(我知道)。
安迪本人在博文中纠正并解释的第一条:
编译器会吐出一连串典型的神秘模板错误,关键错误是这个:
dependent-name
std::basic_string::size_type
被解析为非类型, 但实例化产生类型 c:/program files (x86)/arduino-1.0/ 硬件/工具/avr/lib/gcc/../../avr/include/string:1106:注意: 说typename std::basic_string::size_type
,如果是类型的话基本上,STL 是很久以前编写的,当时 C++ 编译器对从模板继承的依赖类型更加宽容。这些天来,它们变得更加严格,你不得不明确地说你的意思是使用 typename 关键字的类型。
此外,他还提供更新版本供您获取。
最后,在 cmets 中有关于 IDE 的较新版本中与向量类有关的错误的报告,其中编译器抱怨使用 _M_deallocate
而没有前置 this->
,如果您可以修复它在向量类中搜索它们
为了您的方便
由于我经常使用它,我已经打包了当前版本,can be found here(这包括我评论过的两个修复)
最后
使用这个的时候,一定要留意你的空闲内存,为此我推荐优秀的课程MemoryFree Library found here
附带说明,如果您在标题中使用#include<string>
,则无需将其包含在相关的 .cpp 文件中
【讨论】:
以上是关于字符串的 C++ 问题的主要内容,如果未能解决你的问题,请参考以下文章