GCC 15 utilizará el estándar C23 como predeterminado

En la base de código, que servirá de base para la próxima versión del conjunto de compiladores GCC 15 programada para la primavera del próximo año, se ha introducido un cambio que incluye, por defecto, el uso del estándar C23 con extensiones GNU («-std=gnu23») al compilar programas en lenguaje C (anteriormente, el estándar por defecto era C17 — «-std=gnu17»). Este cambio podría causar problemas al compilar proyectos existentes, ya que en el nuevo estándar hay diferencias, como la adición de la constante nullptr, el tipo _BitInt(n) y las palabras clave bool, true y false, que pueden entrar en conflicto con los identificadores homónimos definidos en las aplicaciones.

El estándar C23 (ISO/IEC 9899:2024) fue oficialmente publicado por la Organización Internacional de Normalización (ISO) el 31 de octubre de 2024. Entre los cambios en el nuevo estándar se encuentran:

  • Se eliminó la posibilidad de definir funciones al estilo K&R C, utilizado antes de la aceptación de la especificación ANSI C y descrito en el libro «The C Programming Language» de Kernighan y Ritchie. El estilo K&R implica la descripción de los tipos de argumentos después de la definición de la función, por ejemplo, «int add(a, b) int a, b; {}».
  • Los parámetros no nombrados de las funciones — la no obligatoriedad de indicar nombres de parámetros no utilizados al definir funciones (como en C++). Por ejemplo, ahora se puede escribir «int f(int, int) { return 7; }».
  • Soporte para la sintaxis «[[nombre]]» para definir atributos como en C++ («[[gnu::const]]», «[[deprecated]]», «[[fallthrough]]», «[[maybe_unused]]», «[[nodiscard]]», «[[noreturn]]», «[[reproducible]]», «[[unsequenced]]»). Por ejemplo, el atributo [[noreturn]] permite indicar que una función no retorna valores (el archivo de encabezado stdnoreturn.h y el especificador «_Noreturn» han sido declarados obsoletos).
  • Soporte para la sintaxis u8» para definir constantes con caracteres en UTF-8.
  • Se añadió el tipo char8_t para cadenas y caracteres en codificación UTF-8, así como funciones para convertir cadenas con caracteres multibyte mbrtoc8() y c8rtomb().
  • Se ha cambiado el comportamiento de la palabra clave «auto», que ahora realiza la deducción de tipos al definir objetos, permitiendo usar el modificador «auto» en lugar de un tipo para definir el tipo de variables basado en el tipo de la expresión para su inicialización. Por ejemplo: «auto y = cos(x);».
  • Las funciones con una lista de argumentos vacía ahora se procesan como funciones que no aceptan argumentos.
  • Se ha añadido soporte para los encabezados <stdckdint.h> y <stdbit.h> con macros, funciones y tipos para la verificación de cálculos enteros.
  • Se permite la colocación de etiquetas de salto en cualquier lugar dentro de expresiones compuestas.
  • Se ha dejado de dar soporte en el código a los trigraphs, secuencias de tres caracteres ASCII que se procesan como un solo carácter, por ejemplo, la secuencia «??=» podía ser utilizada en lugar de «#». Tras la llegada de Unicode, el soporte para trigraphs ha perdido sentido.
  • Se ha añadido soporte para los prefijos «0b» y «0B» para indicar valores enteros en forma binaria, por ejemplo, «int b = 0b101010».
  • Se han añadido las palabras clave bool, static_assert, alignas, alignof y thread_local.
  • Se permite el uso de llaves vacías «{}» para inicializar en valores nulos, es decir, ahora se puede escribir «struct S { int x, y } s = {};».
  • Se proporciona la capacidad de usar cualquier nombre universal de carácter en literales de caracteres y cadenas. Por ejemplo, «int \u0024 = 0;».
  • Se ha añadido el macro «unreachable» en «stddef.h».
  • Se ha añadido un nuevo tipo nullptr_t y una constante nullptr para definir punteros nulos que pueden convertirse en cualquier tipo de puntero y representar la variante NULL, no vinculada a tipos enteros y tipo void*. Por ejemplo, se puede escribir «void func(nullptr_t); func(0); func((void *)0);».
  • Se han añadido los tipos «_BitInt (N)» y «unsigned _BitInt (N)» para definir enteros con un número específico de bits, así como los tipos decimales de punto flotante «_Decimal32», «_Decimal64» y «_Decimal128», y funciones para trabajar con estos tipos.
  • Se ha añadido la posibilidad de utilizar el carácter «‘» para separar visualmente los dígitos en los números (por ejemplo, «1’000’000»).
  • Se permite definir estructuras, uniones y enumeraciones más de una vez en un mismo ámbito con el mismo contenido y etiqueta repetida.
  • Se han incluido en el estándar los operadores typeof y typeof_unqual.
  • Ahora se permite el uso del especificador constexpr para definir objetos.
  • Se han añadido macros INFINITY, NAN, FLT_NORM_MAX, DBL_NORM_MAX y LDBL_NORM_MAX en los encabezados float.h y math.h.
  • Se han añadido las directivas de preprocesador #elifdef, #elifndef, #warning y #embed. La directiva «#embed» está destinada a la integración de recursos binarios.
  • Se ha simplificado el uso de listas con un número variable de argumentos (variadic).
  • Se han ampliado las capacidades de las enumeraciones (enum).
  • Se ha añadido soporte para la sustitución «%b» para el manejo de valores binarios en las familias de funciones printf() y scanf().
  • La llamada a la función realloc() con un tamaño cero se traduce en comportamiento indefinido.
  • Se estandarizan las funciones memccpy(), strdup(), strndup(), gmtime_r() y localtime_r().
  • Se declaran obsoletas las funciones asctime() y ctime().
  • Se han traducido los macros static_assert y thread_local a la categoría de palabras clave.

Fuente: opennet.ru

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster