c++ dynamic-arrays

Matriz de longitud variable(VLA) en compiladores C++



dynamic-arrays (2)

Como ya sabemos, los VLA (estandarizados en C99 ) no son parte del estándar en C ++.

Entonces, el siguiente código es "ilegal" en C ++ :

void foo(int n) { int vla[n]; for (int i = 0; i < n; ++i) { vla[i] = i; } }

A pesar de eso, el compilador ( g ++ y clang ++ ) acepta el código como sintaxis válida, produciendo solo una advertencia en caso de que se -pedantic indicador -pedantic .

ISO C ++ prohíbe la matriz de longitud variable ''vla'' [-Wvla]

Mis preguntas son:

  • ¿Por qué el compilador acepta esa declaración?
    ¿El compilador no puede simplemente rechazar una matriz en la que la longitud [is-no-know-at-compile-time] ?
    ¿Hay algún tipo de regla de sintaxis de compatibilidad a seguir?

  • ¿De qué dice la norma?
    Del código de ensamblaje producido veo que el compilador escribe en la pila en el bucle, como una matriz normal, pero no puedo encontrar nada sobre el comportamiento estándar.


¿Por qué el compilador acepta esa declaración?

Porque sus autores decidieron hacerlo hacerlo.

GCC en particular permite, por defecto, muchas cosas no estándar que históricamente fueron aceptadas por los compiladores de C antiguos. Les gusta la "compatibilidad" en ese sentido.

¿Qué dice el estándar sobre [eso]?

Precisamente lo que dice la advertencia al respecto: ISO C ++ prohíbe las matrices de longitud variable.

C ++ no tiene VLA.

Donde ve que se acepta uno, es una extensión del compilador; Para averiguar cómo ese compilador implementa dicha extensión, debe preguntar a los autores del compilador (o examinar su fuente, si corresponde).


El estándar requiere que un compilador conforme debe "emitir un diagnóstico" cuando encuentra algo que es ilegal. Una vez hecho esto, es gratis continuar compilando el código con un significado específico de implementación. (Tenga en cuenta que "con un significado específico de implementación" es una forma educada de "con comportamiento indefinido").