Leo definiciones como
const int ledPin = 9;
y también
#define ledPin 9
Sé que una definición como
int ledPin = 9;
es una mala práctica si no vas a cambiarlo (lo que generalmente no harás), aunque lo he visto varias veces en los programas de Arduino. ¿Cuál de los otros dos es el preferido?
programming
Joris Groosman
fuente
fuente
const int
?const int ledPin = 9;
se prefiere sobre otras 2 opciones. Esto NO asignará memoria para unint
excepto si define un puntero a él en alguna parte, lo que nadie haría.Estrictamente hablando, el
#define
enfoque utilizará un poco menos de memoria. Sin embargo, la diferencia suele ser pequeña. Si necesita reducir el uso de memoria, entonces otras optimizaciones probablemente serían mucho más efectivas.Un argumento a favor del uso
const int
es la seguridad de tipo . Dondequiera que se refiera a ese número de pin por variable, sabrá exactamente qué tipo de datos está obteniendo. Puede ser promovido / convertido implícita o explícitamente por el código que lo usa, pero debe comportarse de maneras muy claras.Por el contrario, el valor en a
#define
está abierto a interpretación. La gran mayoría de las veces, probablemente no le causará ningún problema. Solo debe tener un poco de cuidado si tiene un código que haga suposiciones sobre el tipo o tamaño del valor.Personalmente, casi siempre prefiero el tipo de seguridad a menos que tenga una necesidad muy seria de ahorrar memoria.
fuente
Probablemente la mejor manera sería
const uint8_t LED_PIN = 9; // may require to #include <stdint.h>
o
const byte LED_PIN = 9; // with no include necessary
const unsigned char LED_PIN = 9; // similarly
El nombre está en mayúsculas según la práctica general en C ++ (y otros) para nombrar constantes. Esto no debería usar RAM en sí mismo, y usar aproximadamente 1 byte de memoria de programa por uso.
Sin embargo, puede haber problemas cuando el número es mayor que 127 y se amplía el signo al ser promovido a enteros con signo más grandes (no del todo seguro en esto), aunque es poco probable que eso suceda con los números PIN.
fuente
No solo
ocupa RAM, pero en este caso, usará más RAM de la necesaria, ya que
digitalWrite(uint8_t, uint8_t)
solo necesita argumentos de un byte, y un int suele ser de dos bytes (depende del compilador, pero es típico). Tenga en cuenta que puede dar al literal un tipo explícito en el #define:aunque en un contexto como un argumento de función en el que se requiere un tipo específico (¡porque la función se prototipó correctamente!), se emitiría implícitamente u obtendría un mensaje de error si los tipos no coinciden.
fuente