Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - define o const
Forum - C/C++ - define o const

Avatar
Astaroth (Normal User)
Newbie


Messaggi: 19
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 10:32
Mercoledì, 06/01/2010
Ciao. Scusate, mi potreste spiegare gentilmente quale sia la differenza nel definire una costante con un #define piuttosto che con un const o viceversa?

#define MACRO 5

const int variabile=5;

Il #define è una direttiva al preprocessore, mentre const no... ma...?




Ultima modifica effettuata da pierotofy il 07/01/2010 alle 17:08
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6404
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:26
Mercoledì, 06/01/2010
La #define è propria del C ed è una semplice sostituzione di testo del precompilatore.

La const è propria del moderno C++ ed è gestita dal compilatore con il controllo del tipo di dato.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Astaroth (Normal User)
Newbie


Messaggi: 19
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 12:12
Mercoledì, 06/01/2010
Grazie per la risposta. Ma io uso const anche nel C... e nel mio libro è descritta questa parola chiave. Comunque, quello che mi interessava è capire se le due "forme" sono intercambiabili oppure se è meglio usare #define in un caso e const in un altro. Grazie ancora.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6404
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 12:38
Mercoledì, 06/01/2010
const è stato introdotto come nuovo elemento del C prendendolo dal C++ dove è stato introdotto.

NON e' una alternativa al define perchè la parola chiave const puo' essere usata in tante parti del codice sorgente (nei parametri, nei puntatori, ecc ...).

Quando viene applicata ad una variabile, questa cessa di essere modificabile (quindi non si parla piu' tecnicamente di variabile) e avremo di fatto una costante. Ma l'importante è che quell'elemento, che pure esiste in memoria, non è modificabile.

Cosa completamente diversa la define, che è utilizzata dal precompilatore solamente per sostituire codice sorgente ad altro codice sorgente.

Non sono intercambiabili (t'ho detto che non sono la stessa cosa); in certi casi (dipende dal codice), si puo' ottenere lo stesso scopo, in altri no (ad esempio per indicare che un puntatore non potrà essere modificato hai a disposizione solo la const).


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Astaroth (Normal User)
Newbie


Messaggi: 19
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:15
Mercoledì, 06/01/2010
Grazie mille! Ho capito.

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 20:53
Mercoledì, 06/01/2010
in generale, come regola di buona programmazione, cerca di evitare il più possible i #define. Anche nell'uso delle macro ormai il C ha adottato le funzioni inline, come il C++, quindi si elimina il problema delle macro con side effects (spesso molto difficili da eliminare).

Le uniche occasioni in cui è lecito, ormai, usare i #define è in quei (presumibilmente pochi) pezzi di codice in cui si wrappano le informazioni platform dependent.

un esempio lecito potrebbe essere:
Codice sorgente - presumibilmente C++

  1. #if defined(__GCC)
  2. #define inline static __inline
  3. #elseif defined(MSVC)
  4. // We already have inline keyword
  5. #endif



in questo pezzo di codice, ad esempio creo una macro che sostituisce la stringa "static __inline" ogni volta che incontra "inline", ma solo se sto usando il compilatore GCC, altrimenti non fa nulla. (Questo era utile con alcune versioni di GCC con cui mi sono imbattuto, che non gestivano correttamente la keyword "inline").

PM Quote
Avatar
Astaroth (Normal User)
Newbie


Messaggi: 19
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:52
Mercoledì, 06/01/2010
Grazie! Ma inline serve per ricopiare in memoria l'intera funzione senza chiamarla direttamente vero?

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 9:55
Giovedì, 07/01/2010
detto in parole povere, si.

PM Quote