Eu li definições como
const int ledPin = 9;
e também
#define ledPin 9
Eu sei que uma definição como
int ledPin = 9;
é uma prática ruim se você não vai alterá-lo (o que geralmente não muda), embora eu tenha visto isso várias vezes nos programas do Arduino. Qual dos outros dois é o preferido?
fonte
const int
?const int ledPin = 9;
é preferível a outras 2 opções. Isso NÃO alocará memória para umint
exceto se você definir um ponteiro para algum lugar, o que ninguém faria.A rigor, a
#define
abordagem utilizará um pouco menos de memória. A diferença é geralmente pequena embora. Se você precisar reduzir o uso de memória, outras otimizações provavelmente seriam muito mais eficazes.Um argumento a favor do uso
const int
é o tipo safety . Sempre que você se refere a esse número de PIN por variável, você sabe exatamente que tipo de dados está recebendo. Pode ser promovido / convertido implicitamente ou explicitamente pelo código que o utiliza, mas deve se comportar de maneiras muito claras.Por outro lado, o valor em a
#define
é aberto à interpretação. Na grande maioria das vezes, provavelmente não causará nenhum problema. Você só precisa ter um pouco de cuidado se tiver um código que faça suposições sobre o tipo ou tamanho do valor.Pessoalmente, quase sempre prefiro a segurança de tipo, a menos que tenha uma necessidade muito séria de economizar memória.
fonte
Provavelmente, a melhor maneira seria
const uint8_t LED_PIN = 9; // may require to #include <stdint.h>
ou
const byte LED_PIN = 9; // with no include necessary
const unsigned char LED_PIN = 9; // similarly
O nome está em maiúsculas, conforme a prática geral em C ++ (e outros) para nomear constantes. Isso não deve usar nenhuma RAM por si só e usar cerca de 1 byte de memória do programa por uso.
No entanto, pode haver problemas quando o número é maior que 127 e é estendido por sinal enquanto é promovido para números inteiros maiores assinados (não tenho muita certeza disso), embora seja improvável que isso aconteça com números de pinos.
fonte
Não apenas
use RAM, mas, nesse caso, usará mais RAM do que o necessário, pois
digitalWrite(uint8_t, uint8_t)
só precisa de argumentos de um byte, e um int geralmente é de dois bytes (depende do compilador, mas é típico). Observe que você pode atribuir ao literal um tipo explícito no #define:embora em um contexto como um argumento de função em que um tipo específico seja necessário (porque a função tenha sido adequadamente prototipada!), ela seja convertida implicitamente ou receba uma mensagem de erro se os tipos não corresponderem.
fonte