O GCC 15 usará o padrão C23 por padrão

Na base de código que formará a versão planejada do conjunto de compiladores GCC 15 para a primavera do próximo ano, foi feita uma alteração que inclui, por padrão, o uso do padrão C23 com extensões GNU ('-std=gnu23') ao compilar programas na linguagem C (anteriormente, o padrão C17 era utilizado por padrão - '-std=gnu17'). A mudança pode potencialmente causar problemas na construção de projetos existentes, pois o novo padrão apresenta diferenças, como a adição da constante nullptr, do tipo _BitInt(n) e das palavras-chave bool, true e false, que podem entrar em conflito com identificadores de mesma nome definidos em aplicativos.

O padrão C23 (ISO/IEC 9899:2024) foi oficialmente publicado pela Organização Internacional de Normalização (ISO) em 31 de outubro de 2024. Entre as mudanças no novo padrão estão:

  • Removida a possibilidade de definição de funções no estilo K&R C, utilizado antes da aceitação da especificação ANSI C, conforme descrito no livro 'The C Programming Language' de Kernighan e Ritchie. O estilo K&R implica que os tipos dos argumentos sejam descritos após a definição da função, por exemplo, 'int add(a, b) int a, b; {}'.
  • Parâmetros de função não nomeados - a não obrigatoriedade de especificar nomes para parâmetros não utilizados na definição de funções (como em C++). Por exemplo, agora pode-se escrever 'int f(int, int) { return 7; }'.
  • Suporte à sintaxe '[[nome]]' para definição de atributos como em C++ ('[[gnu::const]]', '[[deprecated]]', '[[fallthrough]]', '[[maybe_unused]]', '[[nodiscard]]', '[[noreturn]]', '[[reproducible]]', '[[unsequenced]]'). Por exemplo, o atributo [[noreturn]] permite indicar que a função não retorna valores (o cabeçalho stdnoreturn.h e o especificador '_Noreturn' foram declarados obsoletos).
  • Suporte à sintaxe u8' para definição de constantes com caracteres em UTF-8.
  • Adicionado o tipo char8_t para strings e caracteres codificados em UTF-8, bem como funções para conversão de strings com caracteres multibyte mbrtoc8() e c8rtomb().
  • Alterada a ação da palavra-chave 'auto', que agora leva à dedução de tipo ao definir objetos, permitindo o uso do modificador 'auto' em vez do tipo para determinar o tipo de variáveis com base no tipo da expressão para sua inicialização. Por exemplo: 'auto y = cos(x);'.
  • Funções com lista de argumentos vazia agora são tratadas como funções que não aceitam argumentos.
  • Foi adicionado suporte para os arquivos de cabeçalho e com macros, funções e tipos para validação de cálculos inteiros.
  • Foi permitido o uso de rótulos de salto em qualquer lugar dentro de expressões compostas.
  • O suporte para trigrafos foi descontinuado na linguagem, sequências de três caracteres ASCII processadas como um único caractere, por exemplo, a sequência "??=" que poderia ser utilizada em vez de "#". Com a chegada do Unicode, o suporte para trigrafos se tornou irrelevante.
  • Foi adicionado suporte para os prefixos "0b" e "0B" para indicar valores inteiros em forma binária, por exemplo, "int b = 0b101010".
  • Foram adicionadas as palavras-chave bool, static_assert, alignas, alignof e thread_local.
  • Foi permitido especificar chaves vazias "{}" para inicialização em valores nulos, ou seja, agora é possível escrever "struct S { int x, y } s = {};".
  • Foi possibilitado o uso de quaisquer nomes de símbolos universais em literais de caracteres e strings. Por exemplo, "int \u0024 = 0;".
  • O macro "unreachable" foi adicionado ao "stddef.h".
  • Foi adicionado um novo tipo nullptr_t e a constante nullptr para representar ponteiros nulos, que podem ser convertidos em qualquer tipo de ponteiros e representar uma variante NULL, não vinculada a tipos inteiros ou ao tipo void*. Por exemplo, é possível especificar "void func(nullptr_t); func(0); func((void *)0);".
  • Foram adicionados os tipos "_BitInt(N)" e "unsigned _BitInt(N)" para especificar inteiros com um número determinado de bits, bem como os tipos decimais de ponto flutuante "_Decimal32", "_Decimal64" e "_Decimal128" e funções para trabalhar com esses tipos.
  • Foi adicionada a possibilidade de usar o símbolo "'" para uma separação visual dos dígitos em números (por exemplo, "1'000'000").
  • Estruturas, uniões e enums podem ser definidos mais de uma vez na mesma área de escopo com o mesmo conteúdo e rótulo repetido.
  • Os operadores typeof e typeof_unqual foram incluídos como padrão.
  • Passou a ser suportado o uso do especificador constexpr para definir objetos.
  • Foram adicionados os macros INFINITY, NAN, FLT_NORM_MAX, DBL_NORM_MAX e LDBL_NORM_MAX nos arquivos de cabeçalho float.h e math.h.
  • Foram adicionadas as diretivas do pré-processador #elifdef, #elifndef, #warning e #embed. O "#embed" é destinado à integração de recursos binários.
  • Foi simplificado o uso de listas com um número variável de argumentos (variadic).
  • As capacidades das enumerações (enum) foram expandidas.
  • Adicionada a suporte para a substituição "%b" para manipulação de valores binários nas famílias de funções printf() e scanf().
  • A chamada da função realloc() com tamanho zero foi transferida para o domínio do comportamento indefinido.
  • As funções memccpy(), strdup(), strndup(), gmtime_r() e localtime_r() foram padronizadas.
  • As funções asctime() e ctime() foram declaradas obsoletas.
  • Os macros static_assert e thread_local foram transferidos para a categoria de palavras-chave.

Fonte: opennet.ru

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster