【问题标题】:How to combine C++ strings and Arduino Strings?如何结合 C++ 字符串和 Arduino 字符串?
【发布时间】:2023-03-14 23:28:02
【问题描述】:

我一直在为我的项目编写一个库(现在我使用的是 Arduino)。我遇到的问题是 C++ 和 Arduino 中的 string 不同。

也就是说,我希望我的库独立于 Arduino,所以我使用#include <string>,然后声明string s;。但是在 Arduino 中,字符串由 Arduino 定义并声明为 String s2

当我在草图中包含我的库时,我在尝试包含 C++ 字符串库 (#include <string>) 的行上得到 error: string: No such file or directory

有没有办法让 Arduino 使用 C++ 字符串库,或者在编译时将字符串转换为 Arduino 字符串?

【问题讨论】:

    标签: c++ string arduino


    【解决方案1】:

    几件事:

    1. 我不确定您独立于 Arduino 做某事的理由。通常,对微控制器进行编程并不是非常可模块化的,并且可能与经典计算机程序非常不同。如果你真的想独立于任何微控制器和任何平台,你仍然可以使用 C 风格的字符串,char * 指向一个字符数组。
    2. 做你想做的事一点都不容易。首先,您需要std::string 库的源代码。仅提供#include <string> 是不够的:您还必须为 AVR 平台编译字符串库。
    3. 与经典计算机程序相比,Arduino 处理 C++ 代码的方式存在一些“限制”:例如,运算符 newdelete 未实现。此外,std::string 实现可能还需要其他东西,因此需要管理大量依赖项,或者代码源对于 Arduino 来说太大。

    对于像 Arduino 这样的 AVR 微控制器,有一些经典字符串工具的实现,但它们是针对 C 风格的字符串以过程方式(而不是面向对象的方式)完成的。例如,对于 avr-gcc 附带的 avr-libc,您可以在此处查看函数列表: avr-libc string.h 你甚至有好老的printfavr-libc stdio.h

    如果您在代码中添加好的头文件,可以将它们与 Arduino 一起使用,但要注意代码的大小!只需使用printf 就可以将大小增加几千字节,这对于微控制器来说可能是巨大的,具体取决于您的需要。

    最后,在我看来,唯一可移植的方法是使用 char * 字符串 http://arduino.cc/en/Reference/String

    【讨论】:

    • 谢谢。我会尝试使用 char*,因为我不需要很多字符串。
    • 如何在没有newdelete 运算符的情况下实现C++?这不会破坏一切吗?
    • 使用 C++,可以使用自动存储在堆栈上创建对象,而不使用堆。您只是在创建对象时不要使用指针和“new”。然后对象会在作用域的末尾自动全部删除,就像经典的原语一样。对于 Arduino,这就是为什么对象通常在全局范围内的任何函数之外创建,然后在 setup() 函数内部初始化(在构造函数中很少完成,首选类似 init() 的函数)。然后它们可以在 loop() 函数中使用,而无需将任何指针引用传递给 loop()。
    【解决方案2】:

    新的 SafeString Arduino 库(可从库管理器中获得)允许您使用“字符串”类型的操作,但无需使用新建/删除。 详细教程可在 https://www.forward.com.au/pfod/ArduinoProgramming/SafeString/index.html

    尽管该库使用 Arduino 接口,例如 Print 和 Stream。直接将它们剥离出来,使该库成为独立于 Arduino 的“标准”C++ 库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-06
      • 2013-01-04
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多