Recentemente ho trovato un interessante comportamento di g ++ se confrontato con MSVC++ 2008. Considerate questo piccolo programma:diverso comportamento di compilatori con allocazione serie
#include <cstdlib>
const int ARR_LENGTH = 512;
void doSomething(int iLen);
int main(int argc, char** argv)
{
doSomething(ARR_LENGTH);
return 0;
}
void doSomething(int iLen)
{
int iTest[iLen];
return;
}
Intende la compilazione? Cosa ne pensi? Secondo la mia conoscenza di C (o C++ per quella materia), questo NON dovrebbe essere compilato, dal momento che posso chiamare la funzione doSomething() con qualsiasi intero che voglio, quindi la dimensione della matrice iTest non può essere determinata in fase di compilazione. Tuttavia, quando provo a compilarlo con g ++, funziona bene. Ora capisco cosa è successo probabilmente qui - il compilatore ha notato che io chiamo questa funzione solo una volta che passo una costante in fase di compilazione come parametro. Alcune ottimizzazioni gravi succedendo qui ... Ma quando provo a compilare questo usando MSVC++ 2008, ottengo questo:
1>c:\prj\test\test.cpp(15) : error C2057: expected constant expression
1>c:\prj\test\test.cpp(15) : error C2466: cannot allocate an array of constant size 0
1>c:\prj\test\test.cpp(15) : error C2133: 'iTest' : unknown size
La mia domanda è: come fa questo corrisponde alla definizione del linguaggio (la C standard (standard C++))? Va bene per g ++ fare una tale ottimizzazione (che in questo caso è facile da vedere, ma la prima volta che l'ho incontrata, era in un grande progetto e non aveva molto senso a prima vista).
possibile duplicato di [Array di lunghezza variabile in C++?] (Http://stackoverflow.com/questions/1887097/variable-length-arrays-in-c) –