En C ++ intenté declarar una matriz global de algún tamaño. Recibí el error:
El conjunto de enlaces no es una constante entera antes del token ']'
Pero cuando declaró una matriz del mismo tipo en la main()
función, funciona bien.
¿Por qué hay un comportamiento diferente aquí?
int y=5;
int arr[y]; //When I comment this line it works fine
int main()
{
int x=5;
int arr2[x]; // This line doesn't show any error.
}
Editar: Muchos están sugiriendo que esta pregunta es un duplicado del error Obteniendo "el enlace de matriz no es una constante entera antes del token ']' . Pero esa pregunta no responde por qué hay un comportamiento diferente.
c++
variable-length-array
Syed Maqthyar
fuente
fuente
main
, no es legal, utiliza la extensión VLA.main
es "aceptado" por su compilador: está utilizando la extensión del compilador, que permite la compilación de VLA, incluso si no son compatibles con el estándar C ++.y
yx
comoconst
? ¿Necesita modificar el valor dey
ox
? Esperemos que no, porque eso plantea muchas preguntas sobre cuán grandearr
yarr2
debería ser, especialmente con la respuesta al orden de inicialización. (Sugerencia: deberían ser constantes)--std=c++17
(o--std=c++11
si es un compilador anterior), y la compilación fallará.Respuestas:
Ambos ejemplos están mal formados en C ++. Si un compilador no diagnostica el último, entonces no se ajusta al estándar.
Utiliza una extensión de idioma que permite matrices automáticas de longitud de tiempo de ejecución. Pero no permite matrices estáticas de longitud de tiempo de ejecución. Las matrices globales tienen almacenamiento estático.
En caso de que esté utilizando GCC, puede pedirle que se ajuste al estándar utilizando la opción de línea de comando -pedantic. Es una buena idea hacerlo para estar informado sobre los problemas de portabilidad.
fuente
El tamaño de una matriz debe ser una constante. Puede solucionar esto declarando
y
comoconst
.En cuanto a por qué esto funcionó
main
, g ++ permite una matriz de longitud variable en el alcance del bloque como una extensión. Sin embargo, no es C ++ estándar.fuente
No deberían usarse ambos, uno funciona porque (como dijo @eerorika) se permiten matrices de longitud automática en tiempo de ejecución, pero las matrices globales deben tener almacenamiento estático.
Si desea declarar una matriz con un tamaño variable (p. Ej., Dada por std :: cin), debería hacer algo similar a:
Pero no podrá configurarlo para que contenga solo ceros con
float arr[n] = {0}
(si necesita agregar un valor a la matriz, sin estar seguro de haberlo configurado), necesitaría usar un bucle como esefuente
El sistema de tipos de C ++ maneja estas matrices tipo C de una manera que define a
arr2
partir de su ejemplo de tipoint[5]
. Entonces, sí, ¡el número de elementos de la matriz es parte del tipo!Esto pone algunas restricciones sobre lo que puede usar en la definición de matrices tipo C. Es decir, este número debe tener almacenamiento estático , debe ser inmutable y debe estar disponible en el momento de la compilación .
Por lo tanto, es posible que desee cambiar su código a algo como lo siguiente, que tendrá otra ventaja. Inicializa la matriz de manera adecuada:
fuente