Biblioteca estándar de C ++ en Arduino [cerrado]

2

¿Por qué no puedo usar std::string o cualquier otro objeto de la biblioteca estándar de C ++ en mis bocetos para Arduino? #include <string> no produce un error, por lo que claramente no tiene problemas para encontrar las bibliotecas, pero en realidad usar cualquier cosa de eso lo hace. Si escribo

std::string str;

me sale

'string' is not a member of 'std'

¿Por qué?

    
pregunta Michael Dorst

2 respuestas

5

Lo más probable es que su comando #include realmente incluya la extensión de archivo .h :

#include <string.h>

Lo que te permite obtener las funciones de manejo de cadenas de estilo C definidas en string.h . Si omite la extensión de archivo:

#include <string>

La salida es entonces es:

Fatal error: string: No such file or directory 
compilation terminated.

Como se esperaba para las cadenas estándar de C ++, que no son fácilmente compatibles con Arduino (consulte la publicación de StackOverflow Kurt E. Clothier menciones )

    
respondido por el angelatlarge
5

El Arduino admite dos tipos de cadenas:

  • Arrays de caracteres de estilo C, a los que la documentación de Arduino se refiere como strings (minúsculas 's))
  • Objetos de cadena, a los que la documentación de Arduino se refiere como Cadenas (mayúscula) S)

El último es similar a std :: string de la biblioteca estándar de C ++ pero ligeramente diferente. Es una implementación específica de Arduino incluida en la biblioteca central de Arduino. Arduino no usa la biblioteca estándar de C ++ ya que aumentaría demasiado el tamaño de su programa.

Probablemente encontrarás que la clase String de Arduino hace lo que necesitas. La diferencia más importante que tiene de std :: string es que no es compatible con los operadores nuevos o eliminados, pero en la mayoría de las situaciones esto es realmente bueno, lo nuevo y lo eliminado solo se usan para asignaciones de memoria dinámicas (basadas en el montón) que generalmente no tienen colóquelo en un microcontrolador de 8 bits con RAM muy limitada.

El hecho de que Arduino no admita operadores nuevos o eliminados no impide el uso de clases de C ++, constructores, etc. Simplemente significa que no puede crear y asignar memoria dinámicamente a ellos. Esta página muestra varios ejemplos de uso de los diversos contructores compatibles con la clase String de Arduino. De hecho, la mayoría de las bibliotecas de Arduino se implementan mediante clases, es solo que cuando se crean instancias de estas clases, se asignan en la pila o como variables globales, en lugar de asignarse dinámicamente con el nuevo operador.

    
respondido por el Phil

Lea otras preguntas en las etiquetas