Dans la base de code sur laquelle sera basé la version prévue du compilateur GCC 15, prévue pour le printemps prochain, un changement a été apporté pour utiliser par défaut la norme C23 avec les extensions GNU (« -std=gnu23 ») lors de la compilation des programmes en C (auparavant, la norme par défaut était C17 — « -std=gnu17 »). Ce changement pourrait potentiellement causer des problèmes lors de la construction de projets existants, car la nouvelle norme contient des différences, telles que l'ajout de la constante nullptr, du type _BitInt(n) et des mots-clés bool, true et false, qui pourraient entrer en conflit avec les identificateurs portant le même nom dans les applications.
La norme C23 (ISO/IEC 9899:2024) a été officiellement publiée par l'organisation internationale de normalisation (ISO) le 31 octobre 2024. Parmi les changements apportés par la nouvelle norme :
- La possibilité de définir des fonctions dans le style K&R C, utilisé avant l'adoption de la spécification ANSI C et décrit dans le livre « The C Programming Language » de Kernighan et Ritchie, a été supprimée. Le style K&R implique la description des types des arguments après la définition de la fonction, par exemple : « int add(a, b) int a, b; {} »
- Les paramètres de fonction sans nom — la possibilité de ne pas indiquer les noms des paramètres non utilisés lors de la définition des fonctions (comme en C++). Par exemple, il est désormais possible d'écrire « int f(int, int) { return 7; } ».
- Prise en charge de la syntaxe « [[nom]] » pour définir des attributs comme en C++ (« [[gnu::const]] », « [[deprecated]] », « [[fallthrough]] », « [[maybe_unused]] », « [[nodiscard]] », « [[noreturn]] », « [[reproducible]] », « [[unsequenced]] »). Par exemple, l'attribut [[noreturn]] permet d'indiquer qu'une fonction ne retourne pas de valeur (le fichier d'en-tête stdnoreturn.h et le modificateur « _Noreturn » ont été déclarés obsolètes).
- Prise en charge de la syntaxe u8» pour définir des constantes avec des caractères en UTF-8.
- Ajout du type char8_t pour les chaînes et les caractères encodés en UTF-8, ainsi que des fonctions pour convertir des chaînes avec des caractères multioctets mbrtoc8() et c8rtomb().
- Changement de l'action du mot-clé « auto », qui entraîne maintenant la déduction du type lors de la définition des objets, permettant ainsi d'utiliser le mot « auto » à la place du type pour définir le type des variables en fonction du type de l'expression pour leur initialisation. Par exemple : « auto y = cos(x); ».
- Les fonctions avec une liste d'arguments vide sont désormais traitées comme des fonctions ne prenant pas d'arguments.
- Ajout de la prise en charge des fichiers d'en-tête et avec des macros, des fonctions et des types pour vérifier les calculs d'entiers.
- La mise en place de balises de transition est désormais autorisée à n'importe quel endroit à l'intérieur des expressions composites.
- La prise en charge des trigrammes dans le code a été interrompue, les séquences de trois caractères ASCII traitées comme un seul caractère, par exemple, la séquence «??=» qui pouvait être utilisée à la place de «#». Avec l'avènement de l'Unicode, le support des trigrammes a perdu son sens.
- Ajout de la prise en charge des préfixes «0b» et «0B» pour indiquer des valeurs entières en forme binaire, par exemple, «int b = 0b101010».
- Ajout des mots-clés bool, static_assert, alignas, alignof et thread_local.
- Il est désormais possible de spécifier des accolades vides «{}» pour initialiser à des valeurs nulles, c'est-à-dire qu'on peut désormais écrire «struct S { int x, y } s = {};».
- Possibilité de spécifier n'importe quel nom symbolique universel dans les littéraux de caractères et de chaînes. Par exemple, «int \u0024 = 0;».
- Ajout de la macro «unreachable» dans «stddef.h».
- Ajout d'un nouveau type nullptr_t et de la constante nullptr pour définir des pointeurs nuls qui peuvent être convertis en n'importe quel type de pointeur et représenter une alternative au NULL, sans lien avec les types entiers ou le type void*. Par exemple, on peut spécifier «void func(nullptr_t); func(0); func((void *)0);».
- Ajout des types «_BitInt (N)» et «unsigned _BitInt (N)» pour définir des entiers avec un nombre spécifié de bits, ainsi que des types décimaux à virgule flottante «_Decimal32», «_Decimal64» et «_Decimal128» et des fonctions pour travailler avec ces types.
- Ajout de la possibilité d'utiliser le symbole «‘» pour une séparation visuelle des chiffres dans les nombres (par exemple, «1’000’000»).
- Les structures, unions et énumérations peuvent être définies plusieurs fois dans le même champ de visibilité avec le même contenu et le même tag répétitif.
- Les opérateurs typeof et typeof_unqual ont été ajoutés aux standards.
- Prise en charge de l'utilisation du spécificateur constexpr pour définir des objets.
- Ajout des macros INFINITY, NAN, FLT_NORM_MAX, DBL_NORM_MAX et LDBL_NORM_MAX dans les fichiers d'en-tête float.h et math.h.
- Ajout des directives de préprocesseur #elifdef, #elifndef, #warning et #embed. «#embed» est destiné à l'intégration de ressources binaires.
- Facilité d'utilisation des listes avec un nombre variable d'arguments (variadic).
- Les capacités des énumérations (enum) ont été étendues.
- Ajout du support du substitut «%b» pour le traitement des valeurs binaires dans les familles de fonctions printf() et scanf().
- L'appel de la fonction realloc() avec une taille nulle est désormais considéré comme un comportement indéfini.
- Les fonctions memccpy(), strdup(), strndup(), gmtime_r() et localtime_r() ont été standardisées.
- Les fonctions asctime() et ctime() ont été déclarées obsolètes.
- Les macros static_assert et thread_local ont été classées dans la catégorie des mots-clés.
Source : opennet.ru
