2010-09-24 27 views
28

En varios compiladores que he utilizado (todos gcc pero varias versiones) me sale un error C99 mode para cosas como declarar int i dentro de la expresión de bucle en lugar de antes (si no utilizo la opción std=c99) Después de leer here entiendo que las opciones gcc-ansi, -std=c89 y -std=iso9899:1990 toda evalúan con el estándar ANSI C, pero yo no entiendo por qué/si debería seleccionar el estándar de c89 frente a un nuevo estándar como c99 (que es el más nuevo Asumo).ANSI C vs otras normas C

Además, veo múltiples versiones de los estándares de tipo iso para el lenguaje C, el primero de los cuales (desde mi entender) es un puerto directo del estándar ANSI. que es, es seguro decir que iso actualizará su nivel de C, pero el estándar ANSI original para C siempre será la misma?

Bono pregunta:

De hecho, me puedo imaginar éste a mí mismo, yo sólo no han tomado el tiempo para hacerlo, sin embargo, así que si alguien sabe de la parte superior de su cabeza y luego lo que es grande , de lo contrario no hay problema, voy a averiguarlo más tarde :)

tengo bastante una nueva impresión del libro The C Programming Language (ANSI). Mi libro siempre muestra los bucles de esta manera:

int i; 

for(i = 0; i < foo; i++) 

pero muchas personas (la mayoría de los que tienen más talento de programación en su dedo meñique) escribir su bucles como este:

(int i = 0; i < foo; i++) 

¿Es correcto Digamos que si escribo el ciclo de la primera manera, entonces el i debería estar accesible para toda la función, pero si lo escribo de la segunda manera, entonces i solo está accesible para el ciclo for SIN IMPORTAR ¿con qué estándar compilo? Otra forma de hacer esta misma pregunta, si compilo con el estándar c89, el i de ambos bucles for será accesible para toda la función y si compilo con el estándar c99, el i del primer bucle for será accesible para toda la función mientras que el i del segundo bucle for será accesible sólo por el bucle?

+1

¿Qué te hace decir que la mayoría de las personas escriben loops así? Ciertamente no es válido C por el estándar c89. –

+0

@Carl Norum Sé que no es válido en 'c89' (suponiendo que con" eso "te refieres a' int i' dentro de la declaración for loop). Casi todos los que he visto escriben sus loops así. ¿Tu observación ha sido diferente? – ubiquibacon

+0

esto tiene que ser duplicado de algo, http://stackoverflow.com/questions/288441/variable-declaration-placement-in-c – Anycorn

Respuesta

20

No entiendo por qué/si debería seleccionar el estándar C89 frente a un nuevo estándar como C99 (que es el más nuevo supongo).

Un par de razones: el apoyo C99

1) de gcc no es del todo completa, mientras que su apoyo es C89. Es por eso que C89 (con extensiones de GNU) es el predeterminado. Entonces, si usted es absolutamente reacio a programar un estándar usando gcc, elija C89.

2) El compilador de Microsoft realmente no es compatible con C99 en absoluto. Entonces, si desea escribir código C portátil, C89 es un estándar común.

que es, es seguro decir que iso actualizará su nivel de C, pero la norma original ANSI para C siempre será el mismo ?

No, ISO C99 también se ha ratificado como un estándar ANSI. El nombre "ansi" adjunto a C89 solo es un desafortunado accidente histórico. Dicho eso, C89 siempre será C89, simplemente no es el estándar ANSI C más reciente.

¿Es correcto decir que si escribo el bucle la primera forma, entonces yo debería ser accesible a toda la función, pero si escribo que el segundo camino, entonces i es sólo se puede acceder al bucle for INDEPENDIENTEMENTE de qué estándar compilo con?

No se puede escribir en la segunda forma en C89 (es decir, con -pedantic se adhieran a la norma), así que no hay "independientemente de lo normal". Las versiones de C con extensiones de GNU no son estándares, son "dialectos" (al menos eso es lo que la página de manual les llama). En C89 el segundo ciclo no es legal, en C99 el segundo limita el alcance de i al ciclo. Obviamente, en ambos casos, el primer ciclo otorga a i un alcance más amplio.

De hecho, a gcc no le gusta el segundo bucle en C89 incluso con las extensiones de GNU habilitadas.

+3

ahh, eso es bueno saber (acerca de que las extensiones de GNU son "dialectos" en lugar de estándares). – ubiquibacon

+1

El compilador de Microsoft ahora es compatible con C99 :) –

+0

@ Étienne: ¿tiene alguna fuente para eso? Sé que MS ha estado agregando algunas características C99, no me di cuenta de que habían anunciado un soporte completo (o incluso sustancialmente completo). –

19

C fue estandarizado por ANSI como C89. Luego fue estandarizado por ISO como C90; no hay diferencias técnicas entre C89 y C90.

C99 es una revisión de la norma C; fue desarrollado por el comité ISO C y estandarizado por ISO y ANSI. Tanto C89 como C99 son estándares ANSI. En lenguaje común, la frase "ANSI C" generalmente se refiere a C89; la K & R 2nd ed. el libro cubre solo C89, no C99.

¿Por qué elegirías usar una versión anterior de C? Bueno, hay al menos dos razones. En primer lugar, puede tener un compilador que no admita C99 (por ejemplo, Microsoft Visual C++ solo es compatible con C89). En segundo lugar, hay un montón de código heredado que usa elementos de C89 que no están permitidos en C99 (puede ver más en la pregunta "C99 backward compatibility", que también contiene un enlace al documento de justificación C99 que describe las diferencias).

En cuanto a la "pregunta de bonificación", no puede declarar una variable en un enunciado for en C89; puedes en C99.En C89, la primera parte de un enunciado for es una expresión.

+0

gracias por tu respuesta, me ayudó a entender el tema con certeza, pero tengo que darle la victoria a Steve Jessop por el desglose y aclarar que 'c89' se conoce como' ANSI' es solo un "accidente histórico". – ubiquibacon

2

No tengo una explicación en profundidad para los estándares de C.

Pero mi postura predeterminada ha sido usar C99 cuando se les da la oportunidad. El hecho de que fue el último estándar desarrollado es una de las razones (tengo una sensación equivocada de que "lo nuevo es mejor").

La razón principal es que puedo declarar variables en bucles for.

C99 válida:

for (int i = 0; i < 100; i++) 
{ 
    doSomething(); 
} 

C89, ANSI o más:

int i; 
for (i = 0; i < 100; i++) 
{ 
    doSomething(); 
} 
0

El C99 implementation of gcc aún no se ha completado, pero bastante usably en programadores vida cotidiana.No tengo la referencia a mano, pero para gcc hay una declaración en algún lugar que cambiarán a C99 (o simplemente a su dialecto gnu99) el día en que se considere que esta implementación está terminada.

La cuestión del uso de las funciones C99 o no, se divide en una parte pragmática:

  • para qué plataformas Tengo que compilar mi código
  • qué características ganaría yo (para mi gusto una mucha limpieza y facilidad para programar portátiles)

y una parte emocional/ideológica. Para lo posterior, no hay cura sino la aplicación del principio de los dinosaurios.