¿En qué compilador debo confiar?

4 minutos de lectura

avatar de usuario
Валера Горбунов

Esta va a ser una pregunta de novato, pero estaba tratando de trabajar en un pequeño ejercicio en el C Idioma (no C++) y me estaba encontrando con algunos problemas.

Digamos que quería usar una matriz dentro de un método cuyo tamaño dependía de uno de los argumentos:

void someFunc(int arSize)
{
    char charArray[arSize];
    // DO STUFF
    ...
}

Cuando trato de compilar esto como un .c archivo dentro estudio visual 2013 Recibo un error que dice que no se permite un tamaño de matriz no constante. Sin embargo, el mismo código funciona dentro de Bloques de código bajo un compilador GNU. ¿En cuál debo confiar? ¿Es normal que los compiladores se comporten de manera tan diferente? Siempre pensé que si estás haciendo algo que no le gusta a un compilador, no deberías hacerlo en primer lugar porque no es un estándar.

¡Cualquier entrada es útil! Vengo de un Fondo en Pitón y estoy tratando de involucrarme más en la programación con estructuras de datos y algoritmos.

Mi plataforma es Windows, como probablemente puedas ver. Por favor, hágame saber si esta pregunta necesita más información antes de que pueda ser respondida.

avatar de usuario
Shafik Yaghmour

Matrices de longitud variable (VLA) área C99 función y Visual Studio hasta hace poco no era compatible con C99 y no estoy seguro de si actualmente es compatible con VLA en la última versión. gcc, por otro lado, admite C99 aunque no completamente. gcc apoya VLA como una extensión fuera del modo C99incluso en C++.

Desde el borrador del estándar C99 sección 6.7.5.2 Array declaradores párrafo 4:

[…] Si el tamaño es una expresión constante entera y el tipo de elemento tiene un tamaño constante conocido, el tipo de matriz no es un tipo de matriz de longitud variable; de lo contrario, el tipo de matriz es un tipo de matriz de longitud variable.

  • gcc tampoco es totalmente compatible con C99. Simplemente admite (muchas) más funciones que MSVC.

    – Renán Gemignani

    29 de agosto de 2013 a las 21:44


  • @RenanGemignani Correcto, aún actualizándose.

    – Shafik Yaghmour

    29/08/2013 a las 21:45

  • Gracias por una respuesta concisa. También me encuentro con problemas como que el compilador de Visual Studio me dice que strcpy no está permitido y que debería probar strcpy_s por seguridad. ¿Alguna posibilidad de que pueda explicar si eso es parte de la diferencia entre C99 y no? Además, si hubiera querido hacer una operación similar en C usando un estándar más antiguo, ¿me vería obligado a declarar una matriz arbitrariamente larga que se ajustara a todas mis necesidades?

    – Валера Горбунов

    29 de agosto de 2013 a las 22:02

  • @ВалераГорбунов para strcpy_s problema, vea este hilo y su alternativa para VLA es usar malloc debería haber muchos hilos en SO sobre el uso malloc y matrices.

    – Shafik Yaghmour

    29 de agosto de 2013 a las 22:07


avatar de usuario
Renán Gemignani

Debe confiar en los compiladores que está utilizando y que desea admitir.

En ese tema en particular: los tamaños de matriz no constantes son válidos en C99, que tampoco es totalmente compatible gcc o por MSVC (compilador C/C++ de Microsoft). gccsin embargo, tiene esta característica del estándar implementada incluso fuera del modo C99, mientras que MSVC no la tiene.

  • El soporte de gcc para C99 es Bastante bien, aunque no del todo al 100%; la mayoría de las características “faltantes” en esa tabla no son realmente necesarias. Ya no es realmente una extensión.

    –Keith Thompson

    29/08/2013 a las 21:45

  • Las matrices de longitud variable c99 son totalmente compatibles con gcc ver gcc.gnu.org/c99status.html

    – ouah

    29 de agosto de 2013 a las 21:47

avatar de usuario
Basile Starynkevitch

Depende del estándar particular que esté siguiendo su compilador de C.

La función que desea se llama matriz de longitud variable (VLA) y se introdujo en el C99 estándar.

Tal vez su Visual Studio admita alguna versión anterior del estándar. Tal vez podría configurarlo para admitir una versión posterior.

Tenga en cuenta que usar VLA con un tamaño enorme podría ser un mal hábito: los VLA generalmente se asignan a la pila, y una pila de marcos de llamada generalmente debe tener un tamaño pequeño (unos pocos kilobytes como máximo en los procesadores actuales), especialmente para el código del kernel o para recursos recursivos o funciones multiproceso. Es posible que desee asignar montones (por ejemplo, con calloc) su matriz si tiene más de mil palabras. Entonces tendrás que free eso mas tarde.

  • Notice that using VLA with a huge size could be a bad habit Los programas que utilizan VLA de gran tamaño simplemente fallan.

    – Vahid Amiri

    15 de enero de 2017 a las 19:43

Esto es un extensión CCG actuando sobre ti.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad