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