programacion programa por para lotes lenguaje ejemplos ejecutar crear comandos batch bat avanzados avanzada archivos archivo c visual-c++ c99 c89 variable-length-array

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



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.