2014-09-19 13 views
7

sto solo salto in C++, proveniente da CC++ dichiarazione dimensione dell'array e const

In C (89/90), un const non è in realtà una costante (in contrapposizione ad un #define 'd, enum, o letterale), ma piuttosto di sola lettura una volta impostato. Vale a dire, posso:

const int x = rand(); 

e va bene - il punto è x non è noto fino al runtime. Quindi, non posso

int arr[x]; // error - x is not a compile-time constant 

Poi, uno degli standard C (99?) È andato avanti e permessi per gli array a lunghezza variabile. Anche se normalmente codifico lo standard ANSI in C, questo ha effettivamente avuto un impatto ora che sto provando a riprendere C++ 11.

Per quanto ne so, il C++ non consente matrici di lunghezza variabile. Tuttavia, molti compilatori lo consentono come estensione (GCC?). Il problema è che ora sto cercando di imparare C++ 11, non posso dire se ciò che sto codificando è C++ valido, o C++ esteso con compatibilità C99. Es:

std::default_random_engine e{}; 
std::uniform_int_distribution<int> d{}; 
const int x{d(e)}; 
int arr[x]; // compiles 

Non posso dire se questo è C++ valido o no. Chiaramente, il valore di x non è noto fino al runtime. Penso di non poter capire la differenza tra C e C++ const?

+0

Non valido. Usa flags '-std = ...' dove '...' è uno standard, ad es. 'C++ 11' o' C++ 98'. – juanchopanza

+2

Si può anche usare '-pedantic' – Jarod42

+0

@juanchopanza In realtà ho compilato usando' -std = C++ 11' e clang non ha prodotto avvisi. Usando la bandiera '-pedantic' come suggeriva Shafik ha fatto apparire gli avvertimenti! – zac

risposta

9

Lei ha ragione VLAs are a C99 feature (opzionale C11) e lo standard C++ non include questa funzionalità anche se entrambi gcc e clang li consentono in C++ come estensione. Possiamo vedere che non sono autorizzati andando alle draft C++11 standard sezione 8.3.4Array che dice:

D1 [ constant-expressionopt] attribute-specifier-seqopt 
    ^^^^^^^^^^^^^^^^^^^^^^ 

Per entrambi gcc e clang utilizzando il flag -pedantic vi avviserà quando si utilizza una proroga. Se hai come target C++ 11, devi specificare anche quello usando -std=c++11. È possibile utilizzare -pedantic-errors per trasformare l'avviso in errori. Se si compila il codice utilizzando -pedantic si dovrebbe vedere il il seguente avviso:

warning: ISO C++ forbids variable length array 'arr' [-Wvla] 
int arr[x]; // compiles 
     ^

gcc documenta il loro supporto per vari standard, impostazioni predefinite e bandiere per far rispettare standard su loro pagina Language Standards Supported by GCC e dice:

per ottenere tutti i dati diagnostici richiesti dallo standard, è necessario specificare anche -pedantic (o -pedantic-errors) se si desidera che siano gli errori anziché gli avvertimenti) .

In generale clang supporta quello gcc fa, ma è possibile trovare ulteriori dettagli sulla loro pagina Language Compatibility.

Nota come menzionato da GingerPlusPlus std:vector è considerata l'alternativa per VLA in C++.

+0

meraviglioso !! Quindi sembra che questo * sia * usando l'estensione C99 – zac

+0

grazie per la (molto veloce) risposta! – zac

+0

Grazie anche per le modifiche .. questo lo rende molto chiaro ora – zac