Pregunta

Estoy acostumbrado al estilo antiguo, C y e han comenzado recientemente a explorar las características de c99.He una pregunta:Mi programa se compile correctamente si puedo usar c99 en mi programa, la c99 bandera con gcc y el enlace es con la previa c99 las bibliotecas?

Así, en caso de que se adhieren a la vieja C89 o evolución?

¿Fue útil?

Solución

Creo que son compatibles en este sentido. Es decir, siempre y cuando el material que se está compilando contra no pisar ninguna de las nuevas golosinas. Por ejemplo, si el viejo código contiene enum bool { false, true }; entonces usted está en problemas. Como un dinosaurio parecido, yo estoy abrazando lentamente el maravilloso nuevo mundo de C99. Después de todo, sólo ha estado ahí al acecho durante unos 10 años;)

Otros consejos

Usted debe evolucionar. Gracias por su atención: -)

En realidad, Voy a ampliar en eso.

Tiene razón de que el C99 ha sido de alrededor durante bastante tiempo. Usted debe (en mi opinión) a utilizar esa norma para otra cosa que el código heredado (en el que sólo corregir los errores en lugar de añadir nuevas características) nada. Es probable que no vale la pena por el código heredado pero se debe (al igual que con todas las decisiones empresariales) hacer su propio análisis de costo / beneficio.

Ya estoy asegurando mi nuevo código es compatible con C1x - aunque no estoy usando ninguna de las nuevas características sin embargo, trato de asegurarse de que no se romperá

.

En cuanto a qué código a tener en cuenta, los autores de las normas tienen compatibilidad con versiones anteriores muy en serio. Su trabajo no fue nunca para diseñar un nuevo lenguaje, que era para codificar las prácticas existentes.

La fase son en este momento les permite un poco más de la latitud en la actualización de la lengua, pero todavía siguen el juramento hipocrático en términos de su salida:. "En primer lugar, no hacer daño"

En general, si su código se rompe con un nuevo estándar, el compilador se ve obligado a decir. Así que simplemente compilar su código base será un excelente comienzo. Sin embargo, si usted lee la C99 documento de justificación , verá la frase "cambio tranquilo" parece -. esto es lo que hay que mirar hacia fuera para

Estos son los cambios de comportamiento en el compilador que no necesita estar informado acerca y puede ser la fuente de mucha angustia y crujir de dientes si su aplicación comienza a actuar extraño. No se preocupe por el "cambio tranquilo en C89" bits -. Si fueran un problerm, que ya lo hubiera mordido por ellas

En ese documento, por cierto, es una excelente lectura para entender por qué el estándar actual dice lo que dice.

respetuosamente:. Pruébalo y averiguar :-)

Sin embargo, tenga en cuenta que incluso si usted necesita para arreglar algunas diferencias Minior compilar, subiendo es probablemente vale la pena.

Si no se violen las características explícitas C99, C90 un código funcionará bien con la bandera c99 c99 otras bibliotecas anteriores.

Sin embargo, hay algunos dos bibliotecas basadas en C89 como ,, que sin duda no va a funcionar.

C99 es mucho más flexible para sentirse libre de migrar: -)

Las convenciones de llamada entre bibliotecas de C no ha cambiado en mucho tiempo, y de hecho, no estoy seguro de que lo ha logrado.

Los sistemas operativos en este punto se basan en gran medida en las convenciones de llamada C desde las API C tienden a ser el nexo de unión entre las piezas del sistema operativo.

Así que, básicamente, la respuesta es "Sí, los binarios será compatible hacia atrás. No, naturalmente, el código de uso de las funciones C99 no puede después ser compilado con un compilador no C99."

Está pensado para ser compatible con versiones anteriores. Se formaliza extensiones que muchos vendedores ya han implementado. Es posible, incluso probable, que un programa bien escrito no tendrá ningún problema al compilar con C99.

En mi experiencia, volver a compilar algunos módulos y no a otros para ahorrar tiempo ... desechos mucho tiempo. Por lo general hay una cierta facilidad se pasa por alto los detalles que necesita el nuevo compilador para hacer que todo compatibles.

Hay algunas partes de la norma C89 que se escriben de manera ambigua, y dependiendo de cómo se interpreta la regla sobre los tipos de punteros y los objetos que están con el acceso, la Norma pueden ser vistos como la descripción de uno de los dos idiomas muy diferentes --uno de los cuales es semánticamente mucho más potente y por lo tanto utilizable en una amplia gama de campos, y uno de los cuales permite más oportunidades para la optimización basada en el compilador. El estándar C99 "aclaró" la regla para dejar claro que no hace ningún esfuerzo para ordenar la compatibilidad con el idioma anterior, a pesar de que se vio favorecido abrumadoramente en muchos campos; También trata como indefinido algunas cosas que se definieron en C89, pero sólo porque las reglas C89 no fueron escritas con la suficiente precisión para prohibir ellos (por ejemplo, el uso de memcpy para el tipo de juegos de palabras en los casos en que el destino tiene una duración montón).

C99 puede, pues, ser compatible con el lenguaje que sus autores pensaron fue descrito por C89, pero no es compatible con el lenguaje que fue procesada por la mayoría de los compiladores C89 largo de la década de 1990.

Algunos C89 características no son válidos C99

Podría decirse que esas características existen sólo por razones históricas, y no debe ser utilizado en los modernos C89 código, pero existen.

La C99 N1256 borrador de estándar prólogo el párrafo 5 se comparan C99 a revisiones anteriores, y es un buen lugar para empezar a buscar esas incompatibilidades, aunque tiene mucho más extensiones de restricciones.

Implícito int retorno y tipos de variables

Mencionado por Lutz en un comentario, por ejemplo,los siguientes son válidos C89:

static i;
f() { return 1; }

pero no C99, en el que tienes que escribir:

static int i;
int f() { return 1; }

Esto también se opone a las llamadas a las funciones sin prototipos en C99: Son prototipos necesarios para todas las funciones en C89, C90 o C99?

n1256 dice:

quitar implícito int

Volver sin expresión para no anular la función de

Válido C89, no válido C99:

int f() { return; }

Creo que en C89 devuelve un valor definido por la implementación.n1256 dice:

volver sin expresión no se permite en la función que devuelve un valor

División de enteros negativos operando

  • C89:rondas para la implementación de la dirección definida
  • C99:se redondea a 0

Así que si tu compilador redondeado a -inf, y confió en que la implementación comportamiento definido, su compilador es que ahora se ve obligado a romper su código en C99.

https://stackoverflow.com/a/3604984/895245

n1256 dice:

fiable división de enteros

Compatibilidad de Windows

Una de las principales preocupación práctica es ser capaz de compilar en Windows, ya que Microsoft no tiene la intención de implementar C99 plenamente demasiado pronto.

Este es, por ejemplo, por qué libgit2 límites permitidos de características de C99.

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