Abilitare i VLA (array di lunghezza variabile) in MS Visual C ++?

Come posso abilitare l’uso di VLA, array di lunghezza variabile come definiti in C99, in MS Visual C ++ o che non è ansible?

Sì, so che lo standard C ++ è basato su C89 e che i VLA non sono disponibili nello standard C89 e quindi non sono disponibili in C ++, ma MSVC ++ dovrebbe anche essere un compilatore C, un comportamento che può essere triggersto usando il / Parametro del compilatore TC ( Compile as C Code (/TC) ). Ma farlo non sembra abilitare i VLA e il processo di compilazione fallisce con gli stessi errori quando si costruisce come C ++ ( Compile as C++ Code (/TP) ). Forse il compilatore C MSVC ++ è compatibile solo con C89 o mi manca qualcosa (qualche costrutto speciale o pragma / define)?

Esempio di codice:

 #include  int main(int argc, char **argv) { char pc[argc+5]; /* do something useful with pc */ return EXIT_SUCCESS; } 

Errori di compilazione:

errore C2057: espressione costante prevista

errore C2466: imansible allocare una matrice di dimensione costante 0

errore C2133: ‘pc’: dimensione sconosciuta

MSVC non è un compilatore C99 e non supporta matrici di lunghezza variabile.

In https://docs.microsoft.com/en-us/cpp/c-language/ansi-conformance MSVC è documentato come conforms a C90.

I VLA sono molto più ordinari da scrivere ma è ansible ottenere un comportamento simile usando alloca() quando l’allocazione dynamic della memoria di std::vector è proibitiva.

http://msdn.microsoft.com/en-us/library/x9sx5da1.aspx

L’uso di alloca() nel tuo esempio darebbe:

 #include  #include  int main(int argc, char **argv) { char* pc = (char*) alloca(sizeof(char) * (argc+5)); /* do something useful with pc */ return EXIT_SUCCESS; } 

Ho incontrato lo stesso problema, questo non è ansible in MS Visual C ++ 2015, invece è ansible utilizzare il vettore per fare quasi la stessa cosa, l’unica differenza è l’overhead trascurabile della routine di gestione delle risorse dell’heap (nuova / eliminazione).

Sebbene i VLA siano convenienti, ma non è una buona idea allocare quantità di memoria non deterministica dalla pila a rischio di overflow dello stack.