Go Down

Topic: #define oppure const int (Read 2480 times) previous topic - next topic

miky_police

Feb 18, 2018, 11:22 am Last Edit: Feb 18, 2018, 11:23 am by miky_police
Salve raga, quando si inizia a scrivere un qualsiasi codice, ma prendendo per esempio il semplice blink ci si comincia sempre col dichiarare pin/variabili/ecc.
Scrivere questo
Code: [Select]

const int led = 3;
void setup() {
  pinMode(led, OUTPUT);
}

void loop() {
  digitalWrite(led, HIGH);
  delay(1000);
  digitalWrite(led, LOW);
  delay(1000);
}


e scrivere questo
Code: [Select]

#define led 3

void setup() {
  pinMode(led, OUTPUT);
}

void loop() {
  digitalWrite(led, HIGH);
  delay(1000);
  digitalWrite(led, LOW);
  delay(1000);
}

porta allo stesso risultato. Ma quali sono allora le effettive differenze.
Io ho provato a modificare tutte le dichiarazioni const int in #define di un mio vecchio progetto, ma alla fine non vi sono state alcune modifiche (almeno all'apparenza) ne in termini di prestazioni ne in termini di spazio occupato nel programma.
Il vero stupido è colui che fa e rifa la stessa cosa aspettandosi risultati diversi. A.E.

nid69ita

#1
Feb 18, 2018, 11:26 am Last Edit: Feb 18, 2018, 11:28 am by nid69ita
Ne parlammo un pò di tempo fa.
In teoria la #define  non occupa memoria perchè fatta una semplice sostituzione dal precompilatore.
Una variabile const in teoria occupa della memoria che il compilatore controlla non fai poi comandi di scrittura sopra.
Sul compilatore gnu che viene usato per compilare per avr, la const si comporta come la define, ovvero è come una semplice sostituzione, ovvero non viene allocata una variabile non modificabile.
Ma questo comportamento non è assicurato su tutti i compilatori.
my name is IGOR, not AIGOR

gpb01

#2
Feb 18, 2018, 11:27 am Last Edit: Feb 18, 2018, 11:27 am by gpb01
Il compilatore è piuttosto furbo ed ottimizza le #define di una valore costante allo stesso modo delle const.

Se fai un po' di ricerche qui sul forum Italiano dovretsi trovare una vecchia discussione in cui si era andati a fondo della faccenda.

Guglielmo

Edit: mi sono sovrapposto a nid :D
Search is Your friend ... or I am Your enemy !

gpb01

... ecco, ad esempio, prova a leggere QUESTO vecchissimo thread ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

SukkoPera

Se puoi usare una costante dichiarata con const, in generale è meglio, perché almeno la costante ha un tipo e il compilatore te ne segnalerà eventuali utilizzi impropri. Se ad esempio dichiari un pin const String, probabilmente qualcosa non andrà per il verso giusto. Inoltre anche i messaggi di errore che il compilatore ti darà dovrebbero essere più chiari. Non ti preoccupare dell'uso di memoria, il compilatore è abbastanza sveglio da capire che non ha bisogno di occupare memoria per qualcosa che non cambia mai, quando ne può fare a meno.

#define è una semplice sostituzione testuale, simile al Trova/Sostituisci, almeno in casi come questo. Funziona ma è più grezzo e non c'è motivo per usarlo qua. La sua potenza viene messa in risalto quando lo usi per realizzare delle macro (ma anche qua, oggi puoi sostituirla con una funzione inline) o quando vuoi "manipolare" i token che definisci, caso comunque relativamente poco frequente e comunque di utilizzo avanzato.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

miky_police

...ma comunque leggendo qua e la un po tutti preferiscono dichiarare const int led = 3; piuttosto che col #define. fortunato che sono abituato ai const int... :D
Il vero stupido è colui che fa e rifa la stessa cosa aspettandosi risultati diversi. A.E.

gpb01

#6
Feb 18, 2018, 11:05 pm Last Edit: Feb 18, 2018, 11:06 pm by gpb01
...ma comunque leggendo qua e la un po tutti preferiscono dichiarare const int led = 3; piuttosto che col #define. fortunato che sono abituato ai const int... :D
... e fai male, dato che, nel caso dei pin, ti basta e avanza arrivare a 255 ... perché sprecare lo spazio di un int ? ? ? Non ti piace un byte ? :D ... const byte led = 3;

Guglielmo
Search is Your friend ... or I am Your enemy !

miky_police

#7
Feb 18, 2018, 11:15 pm Last Edit: Feb 18, 2018, 11:17 pm by miky_police
e vai... ne ho imparata un'altra!! :D :D ;)
grazie guglielmo :D


EDIT: e non solo a questo punto per i pin...ma per qualsiasi int da 0 a 255
Il vero stupido è colui che fa e rifa la stessa cosa aspettandosi risultati diversi. A.E.

Go Up