2010-11-11 7 views
9

He leído que el C89 no es compatible con arreglos de longitud variable, pero el siguiente experimento parece desmentir que:Arrays de longitud variable en C89?

#include <stdio.h> 

int main() 
{ 
    int x; 
    printf("Enter a number: "); 
    scanf("%d", &x); 
    int a[x]; 
    a[0] = 1; 
    // ... 
    return 0; 
} 

Cuando compilo como tal (nombre de fichero asumiendo es va_test.c):

gcc va_test.c -std=c89 -o va_test 

Funciona ...

¿Qué me falta? :-)

+0

yo no le creo. '-std = c89' también desautoriza las declaraciones antes de las declaraciones de variables, que tiene su código, por lo que habría generado un error de compilación si realmente se compiló con' -std = c89'. El valor predeterminado es '-std = gnu90' que admite vlas y muchas otras extensiones para el lenguaje C89/C90. –

+0

@R. GCC 4.3.4 (que es lo que tengo) está contento con las variables, pero no le gustan los comentarios '//'. No está del todo claro para mí si el '// ...' es literal del código real del que pregunta, o si está pensado como una elisión. Yo hubiera pensado lo último. –

+0

Impar Supongo que varía entre versiones de gcc y no lo he probado por un tiempo. –

Respuesta

10

GCC siempre admite matrices de longitud variable AFAIK. Configuración -std a C89 no desactivar las extensiones del CCG ...

Editar: De hecho si usted comprueba aquí:

http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#C-Dialect-Options

Bajo -std = se encuentra el siguiente:

programas ISO C90 (ciertas GNU extensiones que entran en conflicto con ISO C90 están deshabilitadas). Igual que -ansi para el código C .

Preste mucha atención a la palabra "cierta".

+3

Esta página tiene este ejemplo exacto para explicar: http://www.network-theory.co.uk/docs/gccintro/gccintro_28.html – caveman

+0

@caveman: buen enlace :) – Goz

2

Te falta que sin -pedantic, gcc no es (y no pretende ser) un compilador de C estándar. En cambio, compila un dialecto GNU de C, que incluye varias extensiones.

+0

También puede usar '-pedantic-errors' para forzar errores en lugar de advertencias. –

+3

@Matthew: sí, si usted no es lo suficientemente fuerte como para '-Werror' ;-) –

+0

Definitivamente soy un pelele – pmg

7

C89 no reconoce // comentarios.

C89 no permite definiciones entremezcladas con el código.

Necesita fflush(stdout) después del printf para asegurarse de que se muestra el mensaje antes del scanf.

main "se ve mejor", como int main(void)

Trate gcc -std=c89 -pedantic ... lugar

+1

:) ... me recuerda los primeros meses de mi escuela de ingeniería. En aquel entonces, teníamos que codificar el código c89 estándar compatible. 1 advertencia con '-ansi-pedantic' y tienes 0 ... buenos viejos días ... – log0

+0

Lo único que realmente deseo que C89 tenga es' para (int ... 'declaración de variables en la cláusula de control de bucle - - ah, y los tipos enteros exacta de ancho – pmg

+0

me gusta macros variadic también, aunque estoy menos obsesivo de lo que solía ser sobre la dispersión de apagado-and-onable registro a través de toda mi código –

Cuestiones relacionadas