c++ - todas - subrutinas arduino
Código Arduino C++: ¿puedes usar funciones virtuales y excepciones? (6)
Siguiendo con este comentario de la pregunta Escribiendo firmware: ¿ensamblaje o alto nivel? :
Al compilar el código C ++ para la plataforma Arduino , ¿puede usar funciones virtuales, excepciones, etc.? ¿O le gustaría (tiene que) utilizar un subconjunto de C ++ (como se describe en el comentario )?
¿Alguna otra advertencia al programar para la plataforma Arduino?
La documentación dice:
El lenguaje Arduino se basa en C / C ++ y es compatible con todas las construcciones C estándar y algunas características C ++.
No dice nada sobre las funciones virtuales que puedo encontrar.
Intenté un programa simple y compila bien. Aunque no lo he probado en hardware Arduino.
EDITAR: Tampoco he probado excepciones.
La usabilidad de las funciones no está limitada por la plataforma, sino más bien por el compilador que está utilizando.
Verificaría la documentación de tu compilador sobre qué características de idioma son compatibles.
Comeau computing tiene un compilador de C ++ a C que admite todas las características de C ++. No solo funciones virtuales, o excepciones, sino también exportación. Debería llamar a Comeau para que apunte al idioma Arduino, pero no debería ser demasiado difícil.
Usé g ++ con este Makefile y comencé con este código . C ++ desperdicia algo de espacio. Pero los protothreads son demasiado geniales para no usarlos.
El software Arduino usa avr-gcc para compilar bocetos. Las siguientes limitaciones se obtuvieron de las preguntas frecuentes de avrlibc (¿Puedo usar C ++ en el AVR?) :
Soportado
- Funciones virtuales
- Constructores y destructores (incluidos los globales)
No soportado
- Funciones estándar de C ++, clases y clases de plantilla (pero vea este puerto de uClibc ++ para Arduino )
- operadores
new
ydelete
(intentar usarlos hará que el enlazador se queje de referencias externas indefinidas). Esto significa que los objetos solo se pueden crear en la pila. Si se requiere la asignación de memoria dinámica, debe implementarse utilizandomalloc()
yfree()
de tiposC
- Excepciones Como las excepciones están habilitadas por defecto en el frontend de C ++, deben desactivarse
-fno-exceptions
utilizando-fno-exceptions
en las opciones del compilador. Esto es hecho automáticamente por Arduino IDE cuando lanzaavr-gcc
Otros asuntos
- Algunos de los archivos de inclusión suministrados no son seguros para C ++, es decir, deben ser envueltos con
extern "C" { . . . }
El entorno Arduino utiliza la versión AVR de la cadena de herramientas GCC. El código se compila como C ++, por lo que puede usar clases. Las funciones virtuales son posibles; los vtables se almacenarán en la sección .data y tendrán las direcciones correctas. De hecho, la clase base de impresión usa funciones virtuales para adaptar los diversos métodos de "impresión" a los diferentes tipos de salida.
Las excepciones no son compatibles debido a razones de espacio de código. El entorno Arduino pasa "-fno-exceptions" a la línea de comandos del compilador. Ver la fuente para la verificación de esto.
Las plantillas son compatibles. Por ejemplo, esta técnica de operador de inserción de flujo sin costo funciona bien usando una plantilla simple y un operador en línea.