ANSI C vs otros estándares C
gcc ansi-c (4)
En varios compiladores que he usado (todos gcc
pero varias versiones) recibo un error de C99 mode
para cosas como declarar int i
dentro de la expresión de bucle for en lugar de antes (si no uso la opción std=c99
). Después de leer here , entiendo que las opciones de gcc
-ansi
, -std=c89
y -std=iso9899:1990
evalúan según el estándar ANSI C, pero no entiendo por qué / si debo elegir el estándar c89
frente a un nuevo Estándar como c99
(que es el más nuevo que asumo).
Además, veo varias versiones de los estándares de tipo iso
para el lenguaje C, el primero de los cuales (a mi entender) es un puerto directo del estándar ANSI. ¿Es seguro decir que iso
actualizará su estándar para C pero el estándar ANSI original para C siempre será el mismo?
Pregunta extra:
Realmente puedo resolverlo yo mismo, simplemente no me he tomado el tiempo para hacerlo todavía, así que si alguien sabe desde lo alto de su cabeza, entonces eso es genial, de lo contrario no hay problema, lo resolveré más tarde :)
Tengo una impresión bastante nueva del libro The C Programming Language (ANSI)
. Mi libro siempre muestra bucles como este:
int i;
for(i = 0; i < foo; i++)
pero muchas personas (la mayoría de quienes tienen más talento para la programación en su dedo meñique) escriben sus bucles for de esta manera:
(int i = 0; i < foo; i++)
¿Es correcto decir que si escribo el bucle de la primera manera, debería estar accesible para toda la función, pero si lo escribo de la segunda manera, solo puedo acceder al bucle for SIN CUANTO a qué estándar compilo? Otra forma de hacer esta misma pregunta, si compilo con el estándar c89
, la i
de ambos bucles estará accesible para toda la función y si compilo con el estándar c99
, la i
del primer bucle for estará accesible para toda la función ¿Mientras que la i
del segundo bucle for será accesible solo por el bucle for?
No entiendo por qué / si debo elegir el estándar c89 frente a un estándar más nuevo como c99 (que es el más nuevo que supongo).
Un par de razones:
1) El soporte C99 de gcc no está del todo completo, mientras que el soporte C89 sí lo está. Es por eso que C89 (con extensiones GNU) es el predeterminado. Por lo tanto, si usted es un controlador absoluto para la programación a un estándar usando gcc, elija C89.
2) El compilador de Microsoft realmente no soporta C99 en absoluto. Por lo tanto, si desea escribir un código C portátil, C89 es un estándar común.
¿Es seguro decir que iso actualizará su estándar para C pero el estándar ANSI original para C siempre será el mismo?
No, la norma ISO C99 también fue ratificada como norma ANSI. El nombre "ansi" que se adjunta solo al C89 es un desafortunado accidente histórico. Dicho esto, C89 siempre será C89, simplemente no es el estándar ANSI C más reciente.
¿Es correcto decir que si escribo el bucle de la primera manera, debería estar accesible para toda la función, pero si lo escribo de la segunda manera, solo puedo acceder al bucle for SIN CUANTO a qué estándar compilo?
No puede escribirlo de la segunda forma en C89 (es decir, con -pedantic
para adherirse a la norma), por lo que no hay "independientemente de qué norma". Las versiones de C con extensiones de GNU no son estándares, son "dialectos" (al menos así se llama la página de manual). En C89, el segundo bucle no es legal, en C99 el segundo limita el alcance de i
al bucle. Obviamente, en ambos casos, el primer bucle da un alcance más amplio.
De hecho, a gcc no le gusta el segundo bucle en C89, incluso con las extensiones GNU habilitadas.
C fue estandarizado como C89 por ANSI. 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 el lenguaje común, la frase "ANSI C" generalmente se refiere a C89; la K&R 2ª ed. libro cubre sólo C89, no C99.
¿Por qué elegirías usar una versión antigua de C? Bueno, hay al menos dos razones. Primero, puede tener un compilador que no admita C99 (por ejemplo, Microsoft Visual C ++ solo admite C89). En segundo lugar, hay una gran cantidad de código heredado que utiliza elementos de C89 que no están permitidos en C99 (puede ver más en la pregunta "Compatibilidad con versiones anteriores de C99" , que también enlaza con el documento de razones de C99 que describe las diferencias).
En cuanto a la "pregunta de bonificación", no puede declarar una variable en una declaración for en C89; Puedes en C99. En C89, la primera parte de una declaración for es una expresión.
La implementación de gcc en C99 aún no se ha completado, pero es bastante útil en la vida cotidiana de los programadores. No tengo la referencia a mano, pero para gcc hay una declaración de que cambiarán a C99 (o simplemente a su dialecto gnu99) el día en que se considere terminada esta implementación.
La cuestión de usar las características de C99 o no, se divide en una parte pragmática:
- ¿Para qué plataformas tengo que compilar mi código?
- ¿Qué características obtendría (para mi gusto, mucha limpieza y facilidad de programación portátil)
y una parte emocional / ideológica. Para los últimos, no hay cura sino la aplicación del principio de dinosaurio.
No tengo una explicación en profundidad para los estándares C.
Pero mi postura predeterminada ha sido usar C99 cuando se le da la oportunidad. El hecho de que fuera el último estándar desarrollado es una de las razones (tengo la sensación equivocada de que "más nuevo es mejor").
La razón principal es que puedo declarar variables para bucles.
C99 válido:
for (int i = 0; i < 100; i++)
{
doSomething();
}
C89, ANSI y mayores:
int i;
for (i = 0; i < 100; i++)
{
doSomething();
}