()
Newbie
Messaggi:
Iscritto:
|
Buonasera
Vorrei porvi un quesito "etico": in quale punto è opportuno dichiarare le variabili in C?
Mi spiego meglio: il C, come ben sapete, permette di dichiarare dei dati in qualsiasi punto del programma; tuttavia, se ben ricordo era buona norma tra i programmatori "classici" definire le variabili locali all'inizio della funzione. Ora, mi chiedo: è ancora "in vigore", questa consuetudine? Oppure le convenzioni sono cambiate?
Ancora: c'è, a vostro avviso, qualche convenienza (tanto per l'autore del codice quanto per chi eventualmente dovesse, in seguito, revisionarlo) in una condotta piuttosto che in un altra?
|
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
Se la memoria non mi tradisce in C non è un opzione, le variabili vanno dichiarate all'inizio della funzione, per un motivo molto semplice che in assembly è molto facile da intuire. Quando si punta ad una nuova funzione lo stackpointer deve spostarsi per lasciar spazio alle variabili locali, esempio, se ho due interi ad 2 byte ciascuno e uno stack con parole a 8 bit allora lo stackpointer deve spostarsi verso l'alto di 2*2 parole.
Quindi in C è necessario sapere subito quante parole riservare nello stack all'inizio della funzione, ergo le variabili vanno all'inizio della stessa.
Questo è quello che mi ricordo io, non so se nel tempo e con le versioni dei compilatori questi siano diventati piu tolleranti e vadano a cercare all'interno della funzione se vengo dichiarate ulteriori variabili.
In ogni caso aspettiamo qualcuno piu acculturato di me che possa smentire o confermare quello che ho detto.
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Postato originariamente da Template:
Buonasera
Vorrei porvi un quesito "etico": in quale punto è opportuno dichiarare le variabili in C?
|
In C non hai scelta: vanno dichiarate all'inizio delle funzioni.
C++ non ha questa restrizione, ed è praticamente sempre meglio dichiararle vicino al codice che le usa. Permette una maggiore chiarezza e si ha un migliore isolamento.
Codice sorgente - presumibilmente C/C++ |
for (int i = 0; i < 5; i++){
int a;
// qui puoi usare "i" e "a"
}
cout << i; // errore
cout << a; // errore
|
Ultima modifica effettuata da pierotofy il 20/04/2015 alle 2:21
|
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
Piero non è che sapresti, e potresti spiegare come C++ evita questa limitazione?
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6404
Iscritto: 03/01/2010
|
In che senso, evita questa limitazione?
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à. |
|
dmr (Normal User)
Pro
Messaggi: 141
Iscritto: 04/01/2012
|
GCC compila tranquillamente codice C, con variabili dichiarate in ogni parte nel codice.
Ultima modifica effettuata da dmr il 20/04/2015 alle 17:52 |
|
nessuno (Normal User)
Guru^2
Messaggi: 6404
Iscritto: 03/01/2010
|
Postato originariamente da dmr:
GCC compila tranquillamente codice C, con variabili dichiarate in ogni parte nel codice. |
Cioè tu parli di un file, ad esempio,
programma.c
compilato con gcc?
Sicuro di compilare con il corretto switch per lo standard C ?
Ultima modifica effettuata da nessuno il 21/04/2015 alle 10:55
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à. |
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Postato originariamente da Roby94:
Piero non è che sapresti, e potresti spiegare come C++ evita questa limitazione? |
Penso ti stia riferendo al fatto che in Assembly lo stack viene inizializzato ad inizio funzione... la differenza tra:
Codice sorgente - presumibilmente C/C++ |
int i;
for (i = 0; i < 5; i++);
|
e
Codice sorgente - presumibilmente C/C++ |
for (int i = 0; i < 5; i++);
|
E' solamente una rappresentazione di alto livello... quando il compilatore produce il risultante Assembly, i viene sempre e comunque dichiarata ad inizio funzione (anche se nel secondo esempio, è limitata allo scope del for loop). Ma i controlli sullo scope vengono fatti a compile time.
Come fa il compilatore nello specifico? Dipende dall'implementazione.
|
|
dmr (Normal User)
Pro
Messaggi: 141
Iscritto: 04/01/2012
|
Postato originariamente da nessuno:
Postato originariamente da dmr:
GCC compila tranquillamente codice C, con variabili dichiarate in ogni parte nel codice. |
Cioè tu parli di un file, ad esempio,
programma.c
compilato con gcc?
Sicuro di compilare con il corretto switch per lo standard C ?
|
Si. Se non erro, la possibilita' di dichiarare le variabili in ogni parte del codice di una funzione, fu introdotto dallo standard C99. Ultima modifica effettuata da dmr il 21/04/2015 alle 17:45 |
|