Pregunta ¿Cuáles son las nuevas características más útiles en C99? [cerrado]


C99 ha existido por más de 10 años, pero el soporte ha sido lento, por lo que la mayoría de los desarrolladores se han quedado con C89. Incluso hoy, a veces me sorprende un poco cuando me encuentro con las características C99 en el código C.

Ahora que la mayoría de los compiladores principales admiten C99 (una excepción notable es MSVC y algunos compiladores incrustrados también están rezagados), creo que los desarrolladores que trabajan con C probablemente deberían saber qué funciones de C99 están disponibles para ellos. Algunas de las funciones son solo características comunes que nunca fueron estandarizadas antes (snprintf, por ejemplo), o están familiarizados con C ++ (colocación de declaración de variable flexible o línea única) // comentarios), pero algunas de las nuevas características se introdujeron por primera vez en C99 y no son familiares para muchos programadores.

¿Cuáles son las características nuevas más útiles en C99?

Para referencia, el estándar C99 (etiquetado como borrador, pero idéntico al estándar actualizado, hasta donde yo sé), el lista de nuevas funciones, y el Estado de implementación GCC C99.

Una característica por respuesta, por favor; Siéntase libre de dejar respuestas múltiples. Se alientan ejemplos de códigos cortos que demuestran nuevas características.


74


origen


Respuestas:


Estoy tan acostumbrado a escribir

for (int i = 0; i < n; ++i) { ... }

en C ++ que es un dolor usar un compilador no C99 en el que me veo obligado a decir

int i;
for (i = 0; i < n; ++i ) { ... }

72



stdint.hque define int8_t, uint8_t, etc. Ya no tendrás que hacer suposiciones no portátiles sobre qué tan ancho son tus enteros.

uint32_t truth = 0xDECAFBAD;

66



Creo que los nuevos mecanismos de inicialización son extremadamente importantes.

struct { int x, y; } a[10] = { [3] = { .y = 12, .x = 1 } };

OK - no es un ejemplo convincente, pero la notación es precisa. Puede inicializar elementos específicos de una matriz y miembros específicos de una estructura.

Tal vez un mejor ejemplo sea este, aunque admito que no es muy convincente:

enum { Iron = 26, Aluminium = 13, Beryllium = 4, ... };

const char *element_names[] =
{
    [Iron]      = "Iron",
    [Aluminium] = "Aluminium",
    [Beryllium] = "Beryllium",
    ...
};

63



Soporte para comentarios de una línea que comienzan con //.


50



Arrays de longitud variable:

int x;
scanf("%d", &x);
int a[x];
for (int i = 0; i < x; ++i)
    a[i] = i * i;
for (int i = 0; i < x; ++i)
    printf("%d\n", a[i]);

48



Poder declarar variables en ubicaciones distintas al inicio de un bloque.


40



Macros variadas. Facilita la generación de código repetitivo con un número ilimitado de argumentos.


34



snprintf() - en serio, vale la pena poder hacer cadenas con formato seguro.


31