Algunas características C89 no son válidos C99
Podría decirse que existen esas características sólo por razones históricas, y no debe utilizarse en el código C89 moderna, pero existen.
The C99 N1256 standard draft prólogo El párrafo 5 compara C99 con revisiones anteriores, y es un buen lugar para comenzar a buscar esas incompatibilidades, aunque con mucho más extensiones que restricciones.
implícito retorno int y los tipos de variables
mencionadas por Lutz en un comentario, por ejemplo los siguientes son C89 válida:
static i;
f() { return 1; }
pero no C99, en el que usted tiene que escribir:
static int i;
int f() { return 1; }
Esto también impide llamar a las funciones sin prototipos de C99: Are prototypes required for all functions in C89, C90 or C99?
n1256 dice:
eliminar implícito int
Retorno sin expresión para la función no nula
Válido C89, C99 no válido:
int f() { return; }
Creo que en C89 devuelve un valor definido por la implementación.n1256 dice:
retorno sin expresión no permitida en función que devuelve un valor
La división entera con el operando negativo
- C89: rondas a una dirección definida por la implementación
- C99: rondas a 0
Así que si su compilador se redondeó a -inf
, y usted confió en ese comportamiento definido de implementación, su compilador ahora está obligado a romper su código en C99.
https://stackoverflow.com/a/3604984/895245
n1256 dice:
número entero fiable división
compatibilidad con Windows
Una preocupación importante práctica es ser capaz de compilar en Windows, ya que Microsoft does not intend to implement C99 fully too soon .
Esto es por ejemplo por qué libgit2 limits allowed C99 features.
gracias a todas las respuestas. veo más ventajas que inconvenientes aquí, así que empacar cosas y pasar a c99 ahora: p – kar