Nella base di codice su cui si basa il rilascio programmato per primavera del prossimo anno del pacchetto di compilatori GCC 15, è stata apportata una modifica che include, per impostazione predefinita, l'uso dello standard C23 con estensioni GNU ("-std=gnu23") durante la compilazione di programmi in linguaggio C (in precedenza era utilizzato lo standard C17—"-std=gnu17"). Questa modifica può potenzialmente causare problemi durante la compilazione di progetti esistenti, poiché nel nuovo standard ci sono 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 di nome simile definiti nelle applicazioni.
Lo standard C23 (ISO/IEC 9899:2024) è stato ufficialmente pubblicato dall'Organizzazione internazionale per la normazione (ISO) il 31 ottobre 2024. Tra le modifiche nel nuovo standard ci sono:
- È stata rimossa la possibilità di definire le funzioni nello stile K&R C, utilizzato fino all'adozione della specifica ANSI C e descritta nel libro "The C Programming Language" di Kernighan e Ritchie. Lo stile K&R implica la descrizione dei tipi di argomenti dopo la definizione della funzione, ad esempio, "int add(a, b) int a, b; {}".
- Parametri delle funzioni senza nome — l'obbligo di specificare i nomi dei parametri non utilizzati alla definizione delle funzioni (come in C++). Ad esempio, ora è possibile scrivere "int f(int, int) { return 7; }".
- Supporto per la sintassi "[[nome]]" per la definizione degli attributi come in C++ ("[[gnu::const]]", "[[deprecated]]", "[[fallthrough]]", "[[maybe_unused]]", "[[nodiscard]]", "[[noreturn]]", "[[reproducible]]", "[[unsequenced]]"). Ad esempio, l'attributo [[noreturn]] consente di indicare che la funzione non restituisce valori (l'intestazione stdnoreturn.h e il modificatore "_Noreturn" sono stati dichiarati obsoleti).
- Supporto per la sintassi u8 per la definizione di costanti con caratteri in UTF-8.
- È stato aggiunto il tipo char8_t per stringhe e caratteri in codifica UTF-8, così come le funzioni per la conversione di stringhe con caratteri multibyte mbrtoc8() e c8rtomb().
- È stata modificata l'azione della parola chiave "auto", che ora porta all'inferenza del tipo durante la definizione degli oggetti, permettendo di utilizzare l'indicazione "auto" al posto del tipo per determinare il tipo delle variabili basato sul tipo di espressione per la loro inizializzazione. Ad esempio: "auto y = cos(x);".
- Le funzioni con una lista di argomenti vuota ora vengono trattate come funzioni che non accettano argomenti.
- È stato aggiunto il supporto per i file di intestazione e con macro, funzioni e tipi per verificare i calcoli interi.
- È consentito posizionare etichette di salto in qualsiasi punto all'interno di espressioni composite.
- È stato interrotto il supporto per la codifica dei trigraph, sequenze di tre caratteri ASCII trattate come un unico carattere, ad esempio, la sequenza «??=» poteva essere usata al posto di «#». Con l'arrivo di Unicode, il supporto per i trigraph ha perso significato.
- È stato aggiunto il 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, cioè ora è possibile scrivere «struct S { int x, y } s = {};».
- È stata fornita la possibilità di specificare qualsiasi nome di simbolo universale in letterali di caratteri e stringhe. Ad esempio, «int \u0024 = 0;».
- Nel file «stddef.h» è stata aggiunta la macro «unreachable».
- È stato aggiunto un nuovo tipo nullptr_t e la costante nullptr per definire puntatori nulli, che possono essere convertiti in qualsiasi tipo di puntatore e rappresentare una variante di NULL non legata ai tipi interi e al tipo void*. Ad esempio, è possibile specificare «void func(nullptr_t); func(0); func((void *)0);».
- Sono stati aggiunti i tipi «_BitInt (N)» e «unsigned _BitInt (N)» per definire numeri interi con un numero specificato di bit, nonché i tipi decimali in virgola mobile «_Decimal32», «_Decimal64» e «_Decimal128» e funzioni per lavorare con tali tipi.
- È stata aggiunta la possibilità di utilizzare il simbolo «‘» per una chiara separazione delle cifre nei numeri (ad esempio, «1’000’000»).
- Strutture, unioni e enumerazioni possono essere definite più di una volta nella stessa area di visibilità con lo stesso contenuto e tag ripetuti.
- Nel linguaggio standard sono stati inclusi gli operatori typeof e typeof_unqual.
- È stata aggiunta la possibilità di utilizzare il specificatore constexpr per definire oggetti.
- Nei file di intestazione float.h e math.h sono state aggiunte le 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 di risorse binarie.
- È stato semplificato l'uso di elenchi con un numero variabile di argomenti (variadic).
- Le possibilità delle enumerazioni (enum) sono state ampliate.
- È stato aggiunto il 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.
- Le funzioni memccpy(), strdup(), strndup(), gmtime_r() e localtime_r() sono state standardizzate.
- Le funzioni asctime() e ctime() sono state dichiarate obsolette.
- I macro static_assert e thread_local sono stati classificati come parole chiave.
Fonte: opennet.ru
