GCC 15 utilizzerà lo standard C23 per impostazione predefinita

Nel codice sorgente su cui si basa il rilascio programmato per la primavera del prossimo anno del set di compilatori GCC 15, è stata apportata una modifica che prevede l'uso predefinito dello standard C23 con estensioni GNU («-std=gnu23») durante la compilazione dei programmi in linguaggio C (in precedenza, lo standard predefinito era C17 - «-std=gnu17»). Questa modifica potrebbe causare problemi nella compilazione di progetti esistenti, poiché il nuovo standard presenta differenze, come l'aggiunta della costante nullptr, del tipo _BitInt(n) e delle parole chiave bool, true e false, che potrebbero entrare in conflitto con gli identificatori omonimi definiti nelle applicazioni.

Lo standard C23 (ISO/IEC 9899:2024) è stato ufficialmente pubblicato dall'Organizzazione internazionale per la normazione (ISO) il 31 ottobre 2024. Alcuni dei cambiamenti nel nuovo standard includono:

  • È stata rimossa la possibilità di definire funzioni nello stile K&R C, utilizzato prima dell'adozione della specifica ANSI C e descritto nel libro «The C Programming Language» di Kernighan e Ritchie. Lo stile K&R implica la descrizione dei tipi degli argomenti dopo la definizione della funzione, ad esempio, «int add(a, b) int a, b; {}».
  • Parametri delle funzioni non nominati — facoltatività di specificare i nomi dei parametri non utilizzati nella definizione delle funzioni (come in C++). Ad esempio, ora è possibile scrivere «int f(int, int) { return 7; }».
  • Supporto della sintassi «[[nome]]» per definire attributi come in C++ («[[gnu::const]]», «[[deprecated]]», «[[fallthrough]]», «[[maybe_unused]]», «[[nodiscard]]», «[[noreturn]]», «[[reproducible]]», «[[unsequenced]]»). Ad esempio, l'attributo [[noreturn]] indica che la funzione non restituisce valori (l'intestazione stdnoreturn.h e il qualificatore «_Noreturn» sono deprecati).
  • Supporto della sintassi u8» per definire costanti con caratteri in UTF-8.
  • Aggiunto il tipo char8_t per stringhe e caratteri in codifica UTF-8, oltre a funzioni per la conversione di stringhe con caratteri multibyte mbrtoc8() e c8rtomb().
  • Modificato l'effetto della parola chiave «auto», che ora porta all'inferenza del tipo nella definizione degli oggetti, consentendo di usare il qualificatore «auto» invece del tipo per determinare il tipo delle variabili in base al tipo dell'espressione per la loro inizializzazione. Ad esempio: «auto y = cos(x);».
  • Le funzioni con lista di argomenti vuota ora vengono trattate come funzioni che non accettano argomenti.
  • È stata aggiunta la supporto per i file di intestazione <stdckdint.h> e <stdbit.h> con macro, funzioni e tipi per il controllo dei calcoli interi.
  • È consentito posizionare etichette di salto in qualsiasi punto all'interno di espressioni composte.
  • Il supporto per il codice trigrafico è stato interrotto; sequenze di tre caratteri ASCII trattati come un singolo carattere, come la sequenza «??=» utilizzata al posto di «#». Con l'introduzione di Unicode, il supporto per i trigrafi ha perso di significato.
  • È stata aggiunta la supporto per i prefissi «0b» e «0B» per indicare valori interi in forma binaria, ad esempio, «int b = 0b101010».
  • Sono state aggiunte le parole chiave bool, static_assert, alignas, alignof e thread_local.
  • È consentito specificare parentesi vuote «{}» per l'inizializzazione a valori nulli, quindi ora è possibile scrivere «struct S { int x, y } s = {};».
  • È stata fornita la possibilità di specificare nomi simbolici universali in letterali carattere e stringa. Ad esempio, «int \u0024 = 0;».
  • Nel «stddef.h» è stato aggiunto il macro «unreachable».
  • È stato aggiunto un nuovo tipo nullptr_t e una costante nullptr per definire puntatori nulli, che possono essere convertiti in qualsiasi tipo di puntatore e rappresentare il valore NULL, non vincolato a tipi interi e a void*. Ad esempio, si può specificare «void func(nullptr_t); func(0); func((void *)0);».
  • Sono stati aggiunti i tipi «_BitInt (N)» e «unsigned _BitInt (N)» per la definizione di numeri interi con un numero specificato di bit, così come i tipi decimali a virgola mobile «_Decimal32», «_Decimal64» e «_Decimal128» e funzioni per lavorare con questi tipi.
  • È stata aggiunta la possibilità di utilizzare il carattere «‘» per una chiara separazione delle cifre nei numeri (ad esempio, «1’000’000»).
  • È consentito definire strutture, unioni ed enumerazioni più di una volta nello stesso ambito con lo stesso contenuto e tag ripetuto.
  • Gli operatori typeof e typeof_unqual sono stati inclusi nello standard.
  • È stato aggiunto il supporto per l'uso del specificatore constexpr per la definizione di oggetti.
  • Nei file di intestazione float.h e math.h sono stati aggiunti i macro INFINITY, NAN, FLT_NORM_MAX, DBL_NORM_MAX e LDBL_NORM_MAX.
  • Sono state aggiunte le direttive del preprocessore #elifdef, #elifndef, #warning e #embed. «#embed» è destinato all'integrazione delle risorse binarie.
  • Semplificato l'uso delle liste con un numero variabile di argomenti (variadic).
  • Ampliate le funzionalità delle enumerazioni (enum).
  • Aggiunta la supporto per la sostituzione "%b" per la gestione dei valori binari nelle famiglie di funzioni printf() e scanf().
  • La chiamata alla funzione realloc() con dimensione zero è stata classificata come comportamento indefinito.
  • Standardizzate le funzioni memccpy(), strdup(), strndup(), gmtime_r() e localtime_r().
  • Dichiarate obsolescenti le funzioni asctime() e ctime().
  • Le macro static_assert e thread_local sono state classificate come parole chiave.

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster