Pregunta

En varios compiladores que he utilizado (todo gcc pero varias versiones) me sale un error de 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 aquí entiendo que las opciones gcc -ansi, -std=c89 y -std=iso9899:1990 todo se evalúan como 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 supongo).

Además, aparecen varias versiones de las normas de tipo iso para el lenguaje C, el primero de los cuales (de mi entendimiento) es un puerto directo de la norma ANSI. ¿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 puede la forma de saberlo yo mismo, yo no he 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, yo lo averiguará después:)

Me tiene bastante una nueva impresión de la The C Programming Language (ANSI) libro. Mi libro siempre muestra de 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 en su dedo meñique programación) para escribir su bucles de esta manera:

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

¿Es correcto decir que si escribo el bucle de la primera forma, entonces i debe ser accesible a toda la función, pero si lo escribo el segundo camino, entonces i sólo se puede acceder al bucle for SIN compilación de lo normal I con? Otra forma de hacer esta misma pregunta, si compilo con el estándar c89 será el i tanto para los bucles ser accesible a toda la función y si compilo con el estándar c99 será el i del primer bucle ser accesible a toda la función mientras que el i del segundo bucle for será accesible sólo por el bucle for?

¿Fue útil?

Solución

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

Un par de razones:

Soporte C99 1) de gcc no es del todo completa, mientras que su apoyo es C89. Es por eso C89 (con extensiones de GNU) es el valor predeterminado. Así que si usted es un purista absoluta para programar a un estándar utilizando gcc, recoger C89.

2) compilador de Microsoft no apoya realmente C99 en absoluto. Así que si desea escribir código en C portátil, C89 es un estándar común.

Es es seguro decir que iso actualizará su estándar para C pero el original estándar ANSI para C siempre será el misma?

No, ISO C99 se ratificó también como un estándar ANSI. El nombre de "ANSI" está unido a C89 solamente es un accidente histórico lamentable. Dicho esto, siempre será C89 C89, que no es sólo la reciente norma más ANSI C.

¿Es correcto decir que si escribo la bucle de la primera forma, entonces i debe 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 lo compilación estándar de E con?

No se puede escribir en la segunda forma en C89 (es decir, con -pedantic a adherirse a la norma), así que no hay "independientemente de lo normal". Las versiones de C con extensiones GNU no son estándares, son "dialectos" (al menos eso es lo que la página hombre les llama). 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 i un alcance más amplio.

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

Otros consejos

C fue estandarizado como C89 por ANSI. A continuación, se estandarizada por la ISO como C90; no hay diferencias técnicas entre C89 y C90.

C99 es una revisión de la norma C; que fue desarrollado por el comité ISO C y estandarizada por tanto ISO y ANSI. Tanto C89 y C99 son las normas ANSI. En el lenguaje común, la frase "ANSI C" generalmente se refiere a C89; la K & R segunda ed. cubiertas para libros solamente C89, C99 no.

¿Por qué optar por utilizar una versión antigua de C? Bueno, hay al menos dos razones. En primer lugar, es posible que tenga un compilador que no admite C99 (por ejemplo, Microsoft Visual C ++ sólo es compatible con C89). En segundo lugar, hay una gran cantidad de código heredado por ahí que utiliza cosas de C89 que no están permitidos en C99 (se puede ver más a la pregunta " C99 compatibilidad hacia atrás ";., que también vínculos con el documento de justificación C99 que describe las diferencias)

En cuanto a la "pregunta extra," no se puede declarar una variable en un comunicado en el C89; se puede en C99. En C89, la primera parte de una declaración de que es una expresión.

No tengo una explicación en profundidad de las normas C.

Pero mi postura por defecto ha sido la utilización de C99 cuando se les da la oportunidad. El hecho de que era el último estándar desarrollado es una de las razones (no tengo una sensación equivocada de que "más reciente es mejor").

La razón principal es para que pueda declarar variables en los bucles.

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();
}

El aplicación C99 de gcc aún no se ha completado, pero bastante usably en programadores de todos los días la vida. No tengo la referencia a la mano, pero para gcc algún lugar hay un comunicado que van a cambiar a C99 (o simplemente para su gnu99 dialecto) el día en que se considera esta implementación que ser terminada.

La cuestión de usar C99 cuenta o no, se divide en una parte pragmática:

  • para qué plataformas tengo que compilar mi código
  • ¿Qué características ganar I (para mi gusto un montón de limpieza y facilidad de programación portátil)

y una parte emocional / ideológico. Para la tarde, no hay cura, pero la aplicación del principio de los dinosaurios.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top