programa - lenguaje batch
¿Habilitando VLAs(arreglos de longitud variable) en MS Visual C++? (3)
¿Cómo puedo habilitar el uso de VLA, matrices de longitud variable como se define en C99, en MS Visual C ++ o que no es posible en absoluto?
Sí, sé que el estándar C ++ se basa en C89 y que los VLA no están disponibles en el estándar C89 y, por lo tanto, no están disponibles en C ++, pero se supone que MSVC ++ también es un compilador de C, un comportamiento que se puede activar utilizando el Parámetro del compilador / TC ( Compile as C Code (/TC)
). Pero al hacerlo, no parece habilitar los VLA y el proceso de compilación falla con los mismos errores cuando se genera como C ++ ( Compile as C++ Code (/TP)
). ¿Tal vez el compilador MSVC ++ C es compatible solo con C89 o me falta algo (alguna construcción especial o pragma / define)?
Ejemplo de código:
#include <stdlib.h>
int main(int argc, char **argv)
{
char pc[argc+5];
/* do something useful with pc */
return EXIT_SUCCESS;
}
Errores de compilación:
error C2057: expresión constante esperada
error C2466: no se puede asignar una matriz de tamaño constante 0
error C2133: ''pc'': tamaño desconocido
Los VLA son mucho más fáciles de escribir, pero puede obtener un comportamiento similar utilizando alloca()
cuando la asignación de memoria dinámica de std::vector
es prohibitiva.
http://msdn.microsoft.com/en-us/library/x9sx5da1.aspx
Usar alloca()
en tu ejemplo daría:
#include <stdlib.h>
#include <alloca.h>
int main(int argc, char **argv)
{
char* pc = (char*) alloca(sizeof(char) * (argc+5));
/* do something useful with pc */
return EXIT_SUCCESS;
}
MSVC no es un compilador C99 y no admite matrices de longitud variable.
En https://docs.microsoft.com/en-us/cpp/c-language/ansi-conformance se documenta que MSVC cumple con C90.
Me encontré con el mismo problema, esto no es posible en MS Visual C ++ 2015, en vez de eso, puede usar vector para hacer casi lo mismo, solo la diferencia es una sobrecarga despreciable de la rutina de administración de recursos de pila (nueva / eliminar).
Aunque los VLA son convenientes, pero no es una buena idea asignar una cantidad de memoria no determinista de la pila en riesgo de desbordamiento de pila.