A base de código que está sendo usada para construir o conjunto de compiladores GCC 15, programado para ser lançado na próxima primavera, foi alterada para usar o padrão C23 com extensões GNU ("-std=gnu23") por padrão ao compilar programas C (anteriormente, o padrão C17 era usado por padrão - "-std=gnu17"). A mudança pode causar problemas ao construir projetos existentes, pois o novo padrão inclui diferenças como a adição da constante nullptr, o tipo _BitInt(n) e as palavras-chave bool, true e false, que podem entrar em conflito com identificadores de mesmo nome definidos em aplicativos.
A norma C23 (ISO/IEC 9899:2024) foi publicada oficialmente pela Organização Internacional para Padronização (ISO) em 31 de outubro de 2024. Entre as mudanças no novo padrão:
- Foi removida a capacidade de definir funções no estilo C pré-ANSI de K&R C, descrito em The C Programming Language, de Kernighan e Ritchie. O estilo K&R é declarar os tipos de argumentos após a definição da função, por exemplo, "int add(a, b) int a, b; {}»
- Parâmetros de função sem nome - não há necessidade de especificar nomes de parâmetros não utilizados ao definir funções (como em C++). Por exemplo, agora você pode escrever "int f(int, int) { return 7; }».
- Suporte para a sintaxe "[[name]]" para definir atributos como em C++ ("[[gnu::const]]", "[[deprecated]]", "[[fallthrough]]", "[[maybe_unused]]", "[[nodiscard]]", "[[noreturn]]", "[[reproducible]]", "[[unsequenced]]"). Por exemplo, o atributo [[noreturn]] permite que você especifique que uma função não retorna valores (o arquivo de cabeçalho stdnoreturn.h e o especificador "_Noreturn" estão obsoletos).
- Suporte à sintaxe "u8" para definir constantes com caracteres UTF-8.
- Adicionado tipo char8_t para strings e caracteres codificados em UTF-8, bem como funções para converter strings com caracteres multibyte mbrtoc8() e c8rtomb().
- O efeito da palavra-chave "auto" foi alterado para causar inferência de tipo ao definir objetos, permitindo que o sinalizador "auto" seja usado em vez de um tipo para inferir o tipo de variáveis com base no tipo da expressão usada para inicializá-las. Por exemplo: "auto y = cos(x);".
- Funções com uma lista de argumentos vazia agora são tratadas como funções que não aceitam argumentos.
- Adicionado suporte para arquivos de cabeçalho E com macros, funções e tipos para verificar cálculos inteiros.
- É permitido colocar rótulos de transição em qualquer lugar dentro de expressões compostas.
- O código não suporta mais trígrafos, sequências de três caracteres ASCII que são tratadas como um único caractere. Por exemplo, a sequência "??=" poderia ser usada em vez de "#". Após o advento do Unicode, o suporte a trígrafos perdeu o sentido.
- Adicionado suporte para os prefixos "0b" e "0B" para especificar valores inteiros em formato binário, por exemplo, "int b = 0b101010".
- Adicionadas palavras-chave bool, static_assert, alignas, alignof e thread_local.
- Os colchetes vazios "{}" podem ser usados para inicialização com valores zero, ou seja, agora você pode escrever "struct S { int x, y } s = {};".
- É fornecida a capacidade de especificar quaisquer nomes de símbolos universais em literais de caracteres e strings. Por exemplo, "int \u0024 = 0;".
- A macro "unreachable" foi adicionada a "stddef.h".
- Adicionado um novo tipo nullptr_t e uma constante nullptr para definir ponteiros nulos que são conversíveis em qualquer tipo de ponteiro e representam uma variante de NULL que não está vinculada a tipos inteiros ou void*. Por exemplo, você pode especificar "void func(nullptr_t); função(0); func((void *)0);».
- Adicionados os tipos "_BitInt(N)" e "unsigned _BitInt(N))" para definir inteiros com um número especificado de bits, bem como tipos de ponto flutuante decimal "_Decimal32", "_Decimal64" e "_Decimal128" e funções para trabalhar com esses tipos.
- Adicionada a capacidade de usar o símbolo "'" para separar visualmente dígitos em números (por exemplo, "1'000'000").
- Estruturas, uniões e enumerações podem ser definidas mais de uma vez no mesmo escopo com o mesmo conteúdo e uma tag repetida.
- O padrão inclui os operadores typeof e typeof_unqual,
- Foi adicionado suporte para usar o especificador constexpr para definir objetos.
- As macros INFINITY, NAN, FLT_NORM_MAX, DBL_NORM_MAX e LDBL_NORM_MAX foram adicionadas aos arquivos de cabeçalho float.h e math.h.
- Adicionadas diretivas de pré-processador #elifdef, #elifndef, #warning e #embed. "#embed" é destinado à integração de recursos binários.
- O uso de listas variádicas foi simplificado.
- As capacidades das enumerações foram expandidas.
- Adicionado suporte para a substituição "%b" para manipular valores binários nas famílias de funções printf() e scanf().
- Chamar realloc() com tamanho zero agora é um comportamento indefinido.
- As funções memccpy(), strdup(), strndup(), gmtime_r() e localtime_r() foram padronizadas.
- As funções asctime() e ctime() foram descontinuadas.
- As macros static_assert e thread_local foram movidas para a categoria de palavras-chave.
Fonte: opennet.ru
