字符串的 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。 &lt;string.h&gt; 是 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-&gt;,如果您可以修复它在向量类中搜索它们

为了您的方便

由于我经常使用它,我已经打包了当前版本,can be found here(这包括我评论过的两个修复)

最后

使用这个的时候,一定要留意你的空闲内存,为此我推荐优秀的课程MemoryFree Library found here

附带说明,如果您在标题中使用#include&lt;string&gt;,则无需将其包含在相关的 .cpp 文件中

【讨论】:

以上是关于字符串的 C++ 问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中将数字转换为字符串,反之亦然

使用 C++ 拆分字符串 [重复]

C与C++风格的字符串辨析

如何在 C++ 中标记字符串?

在 C++ 中拆分字符串的最佳实践

字符串 C++ 的问题