Je lis des définitions comme
const int ledPin = 9;
et aussi
#define ledPin 9
Je sais qu'une définition comme
int ledPin = 9;
est une mauvaise pratique si vous ne le changez pas (ce que vous ne ferez généralement pas), bien que je l'ai vu plusieurs fois dans les programmes Arduino. Lequel des deux autres est préféré?
la source
const int
?const int ledPin = 9;
est préféré à 2 autres options. Cela n'allouera PAS de mémoire pour unint
sauf si vous lui définissez un pointeur quelque part, ce que personne ne ferait.À strictement parler, l'
#define
approche utilisera un peu moins de mémoire. Cependant, la différence est généralement minime. Si vous devez réduire l'utilisation de la mémoire, d'autres optimisations seraient probablement beaucoup plus efficaces.Un argument en faveur de l'utilisation
const int
est la sécurité des types . Partout où vous faites référence à ce numéro d'identification par variable, vous savez exactement quel type de données vous obtenez. Il peut être promu / converti implicitement ou explicitement par le code qui l'utilise, mais il doit se comporter de manière très claire.En revanche, la valeur de a
#define
est sujette à interprétation. La grande majorité du temps, cela ne vous posera probablement aucun problème. Vous avez juste besoin d'être un peu prudent si vous avez du code qui fait des hypothèses sur le type ou la taille de la valeur.Personnellement, je préfère presque toujours la sécurité de type, sauf si j'ai un besoin très sérieux d'économiser de la mémoire.
la source
La meilleure façon serait probablement
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
Le nom est en majuscules selon la pratique générale en C ++ (et autres) pour nommer les constantes. Cela ne devrait pas utiliser de RAM en soi et utiliser environ 1 octet de mémoire de programme par utilisation.
Cependant, il peut y avoir des problèmes lorsque le nombre est supérieur à 127 et est étendu aux signes tout en étant promu en entiers signés plus grands (pas tout à fait sûr à ce sujet), bien que cela ne se produise probablement pas avec les numéros de broche.
la source
Non seulement
prendre de la RAM, mais dans ce cas, utiliser plus de RAM que nécessaire car il
digitalWrite(uint8_t, uint8_t)
n'a besoin que d'arguments d'un octet, et un int est généralement de deux octets (dépendant du compilateur, mais typique). Notez que vous pouvez donner au littéral un type explicite dans #define:bien que dans un contexte tel qu'un argument de fonction où un type spécifique est requis (car la fonction a été correctement prototypée!), il serait implicitement converti ou obtiendrait un message d'erreur si les types ne correspondent pas.
la source