78 votes

Quelles sont les nouvelles fonctionnalités les plus utiles de C99 ?

C99 existe depuis plus de 10 ans, mais sa prise en charge a été lente, de sorte que la plupart des développeurs sont restés fidèles à la norme C89. Même aujourd'hui, je suis parfois légèrement surpris lorsque je rencontre des fonctionnalités C99 dans du code C.

Maintenant que la plupart des grands compilateurs supportent C99 (MSVC étant une exception notable, et certains compilateurs embarqués étant également à la traîne), je pense que les développeurs qui travaillent avec C devraient probablement savoir quelles sont les fonctionnalités de C99 qui sont à leur disposition. Certaines de ces fonctionnalités sont simplement des fonctionnalités communes qui n'ont jamais été standardisées auparavant ( snprintf par exemple), ou sont familiers du C++ (placement flexible des déclarations de variables, ou ligne simple // ), mais certaines des nouvelles fonctionnalités ont été introduites pour la première fois en C99 et ne sont pas familières à de nombreux programmeurs.

Quelles sont, selon vous, les nouveautés les plus utiles du C99 ?

Pour référence, la norme C99 (étiqueté comme un projet, mais identique à la norme mise à jour, pour autant que je sache), les liste des nouvelles fonctionnalités et le État de la mise en œuvre du GCC C99 .

Une seule fonctionnalité par réponse, s'il vous plaît ; n'hésitez pas à laisser plusieurs réponses. De courts exemples de code démontrant les nouvelles fonctionnalités sont encouragés.

77voto

Jon Reid Points 9726

J'ai tellement l'habitude de taper

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

en C++ qu'il est pénible d'utiliser un compilateur non-C99 où je suis obligé de dire

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

72voto

Brian Campbell Points 101107

stdint.h qui définit int8_t , uint8_t etc. Il n'est plus nécessaire de faire des hypothèses non portables sur la largeur des entiers.

uint32_t truth = 0xDECAFBAD;

66voto

Jonathan Leffler Points 299946

Je pense que les nouveaux mécanismes d'initialisation sont extrêmement importants.

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

D'accord, l'exemple n'est pas très convaincant, mais la notation est exacte. Vous pouvez initialiser des éléments spécifiques d'un tableau et des membres spécifiques d'une structure.

Un meilleur exemple serait peut-être celui-ci - même si j'admets qu'il n'est pas très convaincant :

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

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

51voto

gameover Points 2513

Prise en charge des commentaires d'une ligne commençant par // .

51voto

Mehrdad Afshari Points 204872

Tableaux de longueur 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]);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X