Articles of c89

Comment appliquer des déclarations de variables de style C89 dans gcc?

Je travaille sur une base de code principalement composée de C avec un peu de C ++ et construite principalement avec gcc, mais elle doit parfois être construite avec MSVC. Le compilateur C de Microsoft est toujours à peu près C89 avec quelques extensions mineures et ne prend toujours pas en charge le code mixte […]

Opérations autorisées sur un pointeur éventuellement non valide en raison de l’interprétation ssortingcte de la norme C

Question originale (veuillez voir “Éditer: Scénario mis à jour”) Cette question peut constituer, d’une manière ou d’une autre, une copie d’un vaste ensemble de questions sur le comportement indéfini des pointeurs sur des objects hors de scope, etc. Toutes les questions que j’ai trouvées ici à ce sujet sont principalement des cas d’utilisation spécialisés. Je […]

Déclaration récursive du pointeur de fonction en C

J’aimerais déclarer une fonction qui renvoie un pointeur sur une fonction du même type. Je voudrais l’utiliser pour implémenter des machines d’état comme celle ci-dessous: typedef event_handler_t (*event_handler_t)(event_t*); // compilation error event_handler_t state2(event_t* e); event_handler_t state1(event_t* e) { switch(e->type) { //… case SOME_EVENT: return state2; //… } } event_handler_t state2(event_t* e) { switch(e->type) { //… […]

Devrais-je utiliser «-ansi» ou explicite «-std =…» comme drapeaux de compilation?

J’ai lu qu’ANSI C n’était pas exactement le même qu’ISO C et que les compilateurs pouvaient différer dans l’interprétation de “-ansi”. (gcc le mappe sur C90, clang mappe sur C89) Pour le moment, j’aurais tendance à utiliser “-std = …” sur “-ansi” car il est explicitement indiqué quel standard est utilisé. Comme je suis particulièrement […]

Ordre d’évaluation de l’expression en C

Si j’ai l’expression suivante: c = (a) * (b) Que dit la norme C90 à propos de l’évaluation d’ordre de la sous-expression “a” et “b”?

Variante conforme de l’ancien “struct hack” (?)

Je pense avoir trouvé un moyen de réaliser quelque chose comme le célèbre “struct hack” du portable C89. Je suis curieux de savoir si cela est vraiment conforme à C89. L’idée principale est la suivante: j’alloue une mémoire suffisamment grande pour contenir une structure initiale et les éléments du tableau. La taille exacte est (K […]

Déclarations de variable C après l’en-tête de la fonction dans la définition

Lors de la lecture du code source de FreeBSD (voir: lignes 158-173 de radix.h), j’ai trouvé des déclarations de variables qui suivaient le “titre de fonction” dans la définition. Est-ce valide dans ISO C (C99)? quand cela devrait-il être fait dans le code de production au lieu de simplement déclarer les variables dans “l’en-tête de […]

Ajouter ou assigner un littéral entier à un size_t

Dans CI, vous voyez beaucoup de code qui ajoute ou atsortingbue un littéral entier à une variable size_t . size_t foo = 1; foo += 1; Quelle conversion a lieu ici, et peut-il arriver qu’un size_t soit “mis à niveau” vers un int puis reconverti en un size_t ? Est-ce que ça restrait quand même […]

GNU89, déclarations mixtes et déclarations initiales de boucle

Le dialecte C par défaut pour GCC et ICC est GNU89. GNU89 permet des déclarations mixtes, par exemple int i; i = 0; int j; J’ai déduit (à tort) d’un certain nombre d’autres publications sur SO, par exemple C: pour la déclaration initiale de boucle int , cela signifiait que je pouvais le faire for(int […]

Utilisation de M_PI avec le standard C89

J’utilise C et j’essaie d’obtenir l’access à la constante M_PI (3.14159 …). J’ai importé le fichier d’en-tête math.h, mais la constante M_PI n’était toujours pas définie. Après quelques recherches sur StackOverflow, j’ai constaté que je devais append #define _USE_MATH_DEFINES à mon code (voir l’exemple de code ci-dessous). Cela fonctionne bien lors de la compilation normale, […]