Solo estoy saltando en C ++, viniendo de C
En C (89/90), una const
no es en realidad una constante (a diferencia de #define
‘d, enum
o literal), sino más bien de solo lectura una vez que se establece. Es decir, puedo:
const int x = rand();
y eso está bien, el punto que es x
no se conoce hasta el tiempo de ejecución. Por lo tanto, no puedo
int arr[x]; // error - x is not a compile-time constant
Luego, uno de los estándares C (99?) Siguió adelante y permitió arreglos de longitud variable. Aunque normalmente codifico en contra del estándar ANSI en C, esto realmente ha tenido un impacto ahora que estoy intentando recoger C ++ 11.
Que yo sepa, C ++ no permite arreglos de longitud variable. Sin embargo, muchos comstackdores lo permiten como una extensión (GCC?). El problema es que ahora que estoy tratando de aprender C ++ 11, no puedo saber si lo que estoy codificando es válido en C ++, o C ++ extendido con compatibilidad con C99. Ex:
std::default_random_engine e{}; std::uniform_int_distribution d{}; const int x{d(e)}; int arr[x]; // compiles
No puedo decir si esto es válido C ++ o no. Claramente, el valor de x
no se conoce hasta el tiempo de ejecución. Creo que puedo no entender la diferencia entre C y C ++ const
?
Los VLA correctos son una característica de C99 ( opcional en C11 ) y el estándar de C ++ no incluye esta característica, aunque tanto gcc
como clang
permiten en C ++ como una extensión. Podemos ver que no están permitidos yendo a la sección 8.3.4
Arrays de la norma C ++ 11 borrador que dice:
D1 [ constant-expressionopt] attribute-specifier-seqopt ^^^^^^^^^^^^^^^^^^^^^^
Tanto para gcc
como para clang
usando la -pedantic
se advertirá cuando esté usando una extensión. Si está apuntando a C ++ 11, también debe especificar que use -std=c++11
. Puede utilizar -pedantic-errors
para convertir la advertencia en errores. Si comstack su código usando -pedantic
debería ver la siguiente advertencia:
warning: ISO C++ forbids variable length array 'arr' [-Wvla] int arr[x]; // compiles ^
gcc
documenta su soporte para varios estándares, valores predeterminados y marcas para hacer cumplir el estándar en su página de estándares de idiomas admitidos por GCC y dice:
para obtener todos los diagnósticos requeridos por el estándar, también debe especificar -pedantic (o -pedantic-errors si desea que sean errores en lugar de advertencias).
En general, clang
admite lo que hace gcc
pero puede encontrar más detalles en su página de compatibilidad de idiomas .
Nota como lo menciona GingerPlusPlus std: vector se considera la alternativa para VLA en C ++.