6

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).

+0

possibile duplicato di [Array di lunghezza variabile in C++?] (Http://stackoverflow.com/questions/1887097/variable-length-arrays-in-c) –

risposta

5

C99 (la versione più recente dello standard C) consente matrici di dimensioni dinamiche. Tuttavia, la funzione non è supportata da Visual Studio (che implementa solo il supporto C89)

In C++ non è, e probabilmente non sarà mai, valido.

+0

Perché non sarà mai valido in C++? Il compilatore deve solo regolare il puntatore dello stack, inizializzare tutto con il costruttore predefinito e assicurarsi che venga ripulito all'uscita dello scope, giusto? Non facile, ma neanche impossibile. Sicuramente batte usando 'alloca()'. –

+0

Jalf ha detto che "probabilmente non sarà mai valido", e una buona ragione per pensare che il comitato C++ abbia appena finito di scrivere lo standard per la prossima versione di C++, ha sicuramente considerato tutte le funzionalità che C ha aggiunto in C99, e VLAs weren accettato Vedi anche http://stackoverflow.com/questions/1887097/variable-length-arrays-in-c –

+1

Come ha detto @Ben, è stato rifiutato per l'imminente C++ 0x, quindi avrebbero dovuto invertire tale decisione in per aggiungerlo più tardi. E non è tanto necessario in C++ come lo era in C. C++ ha già 'std :: vector' che risolve molti degli stessi problemi. C'è meno bisogno di VLA in C++. – jalf

2

Gli array di dimensioni dinamiche sono una caratteristica di C99. Se il tuo compilatore supporta C99 (GCC fa, VC non completamente) - e se lanci lo switch C99 -, allora questo verrà compilato.

0

Questo non è standard C++ (ma standard C). Le implementazioni possono fornire alloca (o _alloca con msvc) che fa praticamente il lavoro.