6

he encontrado recientemente un comportamiento interesante de g ++ en comparación con MSVC++ 2008. Considere este pequeño programa:comportamiento diferente de los compiladores con la asignación de gama

#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; 
} 

¿Va a compilar? ¿Qué piensas? De acuerdo con mi conocimiento de C (o C++ para el caso), esto NO debe compilarse, ya que puedo llamar a la función doSomething() con cualquier número entero que desee, por lo que el tamaño de la matriz iTest no puede determinarse en tiempo de compilación. Sin embargo, cuando intento compilar esto con g ++, funciona bien. Ahora puedo entender lo que probablemente pasó aquí: el compilador notó que llamo a esta función solo una vez pasando una constante de tiempo de compilación como parámetro. Algunas optimizaciones graves pasando aquí ... Pero cuando intento compilar este usando MSVC++ 2008, me sale esto:

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 

Mi pregunta es: ¿cómo afecta esto cumple con la definición de la lengua (la C estándar (estándar de C++)? ¿Está bien para g ++ hacer tal optimización (que en este caso es fácil de ver, pero la primera vez que lo encontré fue en un proyecto grande y no tenía mucho sentido a primera vista).

+0

posible duplicado de [matrices de longitud variable en C++?] (Http://stackoverflow.com/questions/1887097/variable-length-arrays-in-c) –

Respuesta

5

C99 (la versión más reciente del estándar C) permite matrices de tamaño dinámico. Sin embargo, la característica no es compatible con Visual Studio (que solo implementa compatibilidad con C89)

En C++ no es, y probablemente nunca será, válido.

+0

¿Por qué nunca será válido en C++? El compilador solo tiene que ajustar el puntero de pila, inicializar todo con el constructor predeterminado y asegurarse de que se limpia en la salida del alcance, ¿verdad? No es fácil, pero tampoco imposible. Seguro que supera el uso de 'alloca()'. –

+0

Jalf dijo "probablemente nunca sea válido", y una buena razón para pensar que el comité de C++ acaba de escribir el estándar para la próxima versión de C++, definitivamente consideraron todas las características que C agregó en C99, y VLAs no no acepto Véase también http://stackoverflow.com/questions/1887097/variable-length-arrays-in-c –

+1

Como dijo @Ben, fue rechazado para el próximo C++ 0x, por lo que tendrían que revertir esa decisión en para agregarlo más tarde. Y no es tan necesario en C++ como en C. C++ ya tiene 'std :: vector', que resuelve muchos de los mismos problemas. Hay menos necesidad de VLA en C++. – jalf

2

Las matrices de tamaño dinámico son una característica de C99. Si su compilador es compatible con C99 (GCC lo hace, VC no lo hace del todo) y si activa el interruptor C99, entonces se compilará.

0

Esto no es estándar C++ (pero estándar C). Las implementaciones pueden proporcionar alloca (o _alloca con msvc) que hace bastante el trabajo.

Cuestiones relacionadas