Newsgroup: it.comp.lang.c++
Titolo: [STD] perchè GCC compila questo codice?

Salve ragazzi.
Un mio amico docente mi ha chiesto come mai il GCC (provate varie versioni
su Linux e Win) compili questo codice senza battere ciglio:
//-------------------------------------------
#include <iostream>
using namespace std;
int main()
{
 int n;
 cout << "Immetti un numero intero: ";
 cin >> n;
 int a[n]; //dovrebbe essere errore!!
 return 0;
}
//-------------------------------------------
E' una questione di opzioni del compilatore?
il problema è nato quando uno studente ha portato un sorgente del genere
(compilato con il Dev-C++, nota incarnazione win32 di GCC/MinGW) che in una
prima istanza non è controllato linea per linea.
In una successiva discussione con lo studente si è addirittura verificato
che il programma allocava correttamente sullo heap.
Io non sono molto pratico di GCC, e per adesso ho risolto fornendogli il
compilatore Borland c++ compiler 5.5.1, che rileva correttamente la
necessità di un'espressione costante nella linea incriminata. Ciò non
toglie
che vorrei venire a capo dell'anomalia, che mi pare davvero strana in un
compilatore del calibro di gcc.
Grazie.
Francesco Pera
(NOTA: per un errore di 
newsland.it
 il messaggio è stato inviato una prima
volta a i.c.l.c; me ne scuso)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 [snip codice non conforme]
quella che stai utilizzando (magari inconsciamente :-)) è un'estensione
del compilatore. In teoria il codice qui presentato non dovrebbe essere
compilato (il Borland si lamenta, giustamente). Probabilmente c'è qualche
opzione del compilatore che ti permette di disabilitare le estensioni, ma
non so quale possa essere.


 non so quale possa essere.
Prova con gcc -W -Wall -ansi -pedantic -o nomefile sorgenti e dovrebbe 
essere abbastanza pignolo da segnalarti un errore
-- 
Andrea Bergia - studente          Linux Registred User #281550
Per favore non mandatemi allegati in Word o PowerPoint.
Si veda 
http://www.fsf.org/philosophy/no-word-attachments.html

del compilatore.
dici che lo sta convertendo automaticamente in un
int *a = new int[n]
?
Sarebbe brutto perché poi mancherebbe il delete ^_^
Fossi in te io chiederei su una mailing list di 
http://gcc.gnu.org/
--
L a p o   L u c h i n i
l a p o @ l a p o . i t
w w w . l a p o . i t /

 int *a = new int[n]
Piu' probabilmente lo alloca direttamente sullo stack.
Ciao,
Nicola
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ?
Se non erro i variable length array sono un'estensione del C99, e'
probabile che come sua estensione proprietaria il gcc lo supporti
anche x il C++, ovviamente il distruttore e' implicito e viene
chiamato nel momento in cui a[] esce dallo scope.
Questo esempio e' carino e mostra come con i variable length array
sizeof() diventi un'espressione valutata runtime:
#include <iostream>
int main(int argc, char *argv[])
{
    if(argc!=2) return 0;
    int len = atoi(argv[1]);
    int a[len];
    std::cout << "Sizeof di a:" << sizeof(a) << std::endl;
    return 0;
}
Compilato su linux col gcc 3.2 da i seguenti risultati:
g++ -Wall -o test test.cc  -> OK, 0 errori e 0 warning
g++ -pedantic -Wall -o test test.cc
test.cc: In function `int main(int, char**)':
test.cc:9: warning: ISO C++ forbids variable-size array `a'
Bye,
 Gabry