Newsgroup: it.comp.lang.c
Titolo: differenze tra define e const

ciao, non riesco a capire se esiste una differenza sostanziale a livello di
velocita' di esecuzione tra una define e una costante dichiarata con
l'attributo const
quello che ho capito e' che una define e' una direttiva al preprocessore,
quindi in fase di precompilazione viene "espansa" cioe' dove e' utilizzata
questa define viene sostituito il suo valore dichiarato nella define
ma a livello di velocita' di escuzione del task cambia qualcosa???
su i manuali C non ho trovato molto, quindi lo chiedo a voi: secondo me sia
le define che le const vengono caricate, quando viene caricato il programma,
nella sezione dati generale della ram... se e' cosi' sia a livello di
dimensioni dell'eseguibile che di velocita' di esecuzione non cambia niente,
ma allora qual'e' questa differenza tra una define e una costante dichiarata
con const???
ciao e grazie in anticipo!!!

 dichiarata con const???
Che una (se proprio sei in cerca di rogne) puoi anche modificarla e
l'altra no?
C:\>iao Angelo
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 l'altra no?
Di una puoi prendere l'indirizzo...
Lanugo

 Di una puoi prendere l'indirizzo...
... solo pero' se il puntatore e' a un valore "const":
const int pippo = 100;
...
int * pluto = & pippo; /* ERRORE! (O, almeno, un WARNING grosso quanto una
casa!) */
const int * pluto = & pippo; /* OK! */


ora credo di averlo capito pure io...con il define, il preprocessore
sostituisce ad ogni occorrenza della costante il suo valore simbolico. con
const rimane il nome della costante, solo che non può essere modificato il
suo valore.
"giusto prof?"
Raffaele

 che valore avra' la variabile).
E' se hai un blocco di istruzioni contenente
const int m = 5;
int array[m];
che tipo di allocazione da ad array? Ovvero, risolve tutto a run-time
secondo il normale modello dei VLA, oppure
alloca array staticamente a 5 (comportamento non standard)?
Ciao.

 alloca array staticamente a 5 (comportamento non standard)?
Allocarlo staticamente a 5 mi pare un'assunzione lecita da parte del
compilatore (lo so che si puo' provare a modificare il valore di una const
truschinando con cast e robetta varia, ma mi pare che il risultato sia
undefined).
Da qualche parte ho una draft dello standard per il C89, magari dopo
controllo (influenza permettendo).
Saluti,
Lanugo

 suo valore.
Non e' detto: e' un undefined behavior (significa che il risultato
dell'operazione dipende dal compilatore).
Ad es. gcc ti permette di modificare il valore di una variabile dichiarata
const (anche se un warning te lo segnala), che sia intelligente farlo e'
tutto da dimostrare. :-)


 dell'operazione dipende dal compilatore).
si, intendevo che in teoria non si può modificare...poi si sa che tra teoria
e pratica ci passa un bue di traverso....
Raffaele


Saluti
Rosario Ianuale

 teoria e pratica ci passa un bue di traverso....
Beh, i seguente codice:
  int *s;    
  const int c = 2;
  s = (int *)&c;
  *s= 4;
  cout << c;
sia il gcc (win32) che il vc lo compilano senza fiatare, ma in entrambi i 
casi la variabile const resiste stoicamente alla forzatura.
Visto che il comportamento è "undefined" potrebbe accadere anche qualcosa 
di diverso. Se ci sono dei casi...
-- 
In silenzio anche un idiota sembra intelligente. Ma non c'è problema,
l'idiota vuol sempre dire la sua.

 casi la variabile const resiste stoicamente alla forzatura.
In realta' c non resiste alla modifica (basta dare un'occhiata al codice
assembler) e' il compilatore (C++ e non C) a fare in modo che venga
stampato il valore 2 (sostituendo 2 ogni volta che trova un'occorrenza di
c). g++ e VC++ si comportano alla stessa maniera perche' in C++ una const
e' realmente una costante.
Compilando il programma in C, sia gcc che VC++ stampano 4 (come ci si puo'
accorgere usando printf al posto di cout e dando l'estensione .c al nome
del file nel caso si usi VC++ :-))
Il C _*NON E'*_ un sotto insieme proprio del C++. In alcuni casi, con
istruzioni uguali, i due linguaggi si comportano in maniera diversa.
C:\>iao Angelo.


 istruzioni uguali, i due linguaggi si comportano in maniera diversa.
Yes, I know. Non so tutte le differenze, ogni tanto ne scopro una.
-- 
---
In silenzio anche un idiota sembra intelligente. Ma non c'č problema,
