C23, formalmente ISO/IEC 9899:2024, es el estándar abierto actual para el lenguaje de programación C, que reemplaza a C17 (ISO/IEC 9899:2018). [1] Su desarrollo comenzó en 2016, bajo el nombre de C2x, [2] y se publicó el 31 de octubre de 2024. [3] El borrador libre más similar al publicado es el documento N3220 [4] (ver Textos disponibles, más abajo). La primera reunión del GT14 para el borrador de C2x se celebró en octubre de 2019, [5] se celebraron reuniones remotas virtuales en 2020 debido a la pandemia de COVID-19, y luego varias reuniones por teleconferencia hasta 2024.
En C23, el valor de __STDC_VERSION__ cambia de 201710L a 202311L. Los nombres comunes "C17" y "C23" reflejan estos valores, que fueron fijados antes de la adopción final, en lugar de los años en los identificadores de las normas ISO (9899:2018 y 9899:2024).
Características
A continuación se enumeran los cambios integrados en el último borrador del estándar C23. [6]
Biblioteca estándar
Nuevas funciones
memset_explicit()enpara borrar información sensible, donde la operación de memoria siempre debe ser realizada, sin importar las optimizaciones. [7]memccpy()enpara concatenar cadenas de forma eficiente – similar a las extensiones POSIX y SVID.[8]strdup()ystrndup()enpara crear una copia de una cadena – similar a las extensiones POSIX y SVID.[9]memalignment()enpara determinar el alineamiento de bytes de un puntero.[10]- Añade functiones / macros / tipos para trabajar con bits en un nuevo fichero de cabecera
. Todos empiezan constdc_para minimizar conflictos con código existente y librerías de terceros.[11]- En las siguientes, sustituye
*conuc,us,ui,ul,ullpara obtener el nombre de 5 funciones diferentes, o déjalo vacío para una maro genérica.[11] stdc_count_ones*()ystdc_count_zeros*()para contar el número de 1 o 0 en los bits de un valor.[11]stdc_leading_ones*()ystdc_leading_zeros*()para contar el número de 1 o 0 al principio de los bits de un valor.[11]stdc_trailing_ones*()ystdc_trailing_zeros*()para contar el número de 1 o 0 al final de los bits de un valor.[11]stdc_first_leading_one*()ystdc_first_leading_zero*()para buscar el primer bit con un 1 o 0 en los bits de un valor.[11]stdc_first_trailing_one*()ystdc_first_trailing_zero*()para buscar el último bit con un 1 o 0 en los bits de un valor.[11]stdc_has_single_bit*()para determinar si un valor tiene un solo bit a 0 (es decir, si es una potencia de 2).[11]stdc_bit_floor*()para encontrar el primer entero potencia de dos que es menor o igual a ese valor.[11]stdc_bit_ceil*()para encontrar el primer entero potencia de dos que es mayor o igual a ese valor.[11]stdc_bit_width*()para determinar el número de bits necesarios para almacenar un valor.[11]
- En las siguientes, sustituye
timegm()enuna estructuratimeen un valorcallendar- similar a las funciones en las librerías glibc y musl.[12]- Nuevas funciones en
basadas en las recomendaciones del estándar IEEE 754-2019 como, por ejemplo, funciones trigonométricas que operan en unidades de yexp10.[13]
Funciones ya existentes
- Añade el especificador de conversión binaria
%ba la familia de funcionesprintf(). [14] - Añade el especificador de conversión binaria
%ba la familia de funcionesscanf(). [14] - Añade soporte de conversión binaria
0by0Ba las familias de funcionesstrtol()ywcstol(). [14] - Hace que las funciones
bsearch,bsearch_s,memchr,strchr,strpbrk,strrchr,strstry sus contrapartes "wide" (wchar_t)wmemchr,wcschr,wcspbrk,wcsrchr,wcsstr,devuelvan un objeto calificado como const si se les pasó uno. [15]
Preprocesador
- Añade directivas #elifdef y #elifndef, [16] que son esencialmente equivalentes a #elif defined y #elif !defined . Ambas directivas se agregaron al estándar C 23 y GCC 12. [17]
- Añade la directiva #embed para la inclusión de recursos binarios y __has_embed permitiendo que la disponibilidad de un recurso sea verificada por directivas del preprocesador. [18]
- Añade la directiva #warning. [19]
- Añade la macro
__has_includepermitiendo que las directivas del preprocesador verifiquen la disponibilidad de un encabezado. [20] - Añade la macro
__has_c_attributepermitiendo que la disponibilidad de un atributo sea verificada por el preprocesador. [21] (consulte el grupo "Compatibilidad con C " para conocer la nueva función de atributo) - Añade la macro funcional __VA_OPT__ para las macros variádicas, que se expande a su argumento solo si se ha pasado un argumento variádico a la macro que lo contiene. [22]
Tipos
- Añade
nullptr_t, un tipo de puntero nulo . [23] - Añade
_BitInt (N)yunsigned _BitInt (N)tipos para números enteros con precisión de bits. Añade BITINT_MAXWIDTH macro para ancho de bit máximo. [24] [25] - Añade las macros
ckd_add(),ckd_sub()yckd_mul()para operaciones comprobadas con números enteros. [26] - Los tipos modificados de forma variable (pero no los VLA, que son variables automáticas asignadas en la pila) se convierten en una característica obligatoria. [27]
- Mejor soporte para el uso de
constcon matrices. [28] - Estandarización del operador
typeof (...). [29] - El significado la palabra clave
autose modificó para proveer al lenguaje de inferencia de tipo. Pero se sigue conservando su antiguo significado de especificador de clase de almacenamiento si se usa junto con un tipo. A diferencia de C , C23 permite la inferencia de tipos solo para definiciones de objetos (no se puede inferir el tipo de retorno de una función o el tipo de parámetro de una función). [30] - Se cambiaron las reglas de compatibilidad para estructuras, uniones y tipos enumerados para permitir una redeclaración de un tipo compatible con la misma etiqueta. [31]
- Los números enteros de ancho exacto ahora pueden superar
intmax_t(N2888). [32]
Constantes
Las siguientes constantes son definidas por el estándar:
nullptrpara el tiponullptr_t. [23]- Sufijos literales enteros
wbyuwbpara los tipos_BitInt(N)y unsigned_BitInt(N).[33] De esta forma,6uwb produce ununsigned _BitInt(3)y-6 wbproduce unsigned _BitInt(4)que tiene tres bits de valor y un bit de signo. - Prefijos para constantes literales binarios
0by0B,.[34] Por ejemplo: 0b10101010 (equivale a 0xAA). - El caracter
'como un separador de dígitos para las constantes literales.[35] Por ejemplo: 0xFE'DC'BA'98 (equivalente a 0xFEDCBA98), 299'792'458 (equivalente a 299792458 ) y 1.414'213'562 (equivalente a 1,414213562 ). - La capacidad de especificar el tipo subyacente de un enumerado . [36]
- Permite enumerados sin un tipo subyacente fijo para almacenar valores que no se pueden representar mediante
int. [37]
Palabras clave
Las siguientes palabras claves son definidas:
- true y false [38]
alignas,alignof,bool,static_assert,thread_local. Las palabras clave definidas previamente se convierten en alternativas equivalentes:_Alignas,_Alignof,_Bool,_Static_assert,_Thread_local. [39]_BitInt(ver grupo "tipos")typeofytypeof_unqual(ver grupo "tipos")nullptr(ver grupo "constantes")constexpr(ver grupo "otros")_Decimal32,_Decimal64,_Decimal128para aritmética de punto flotante decimal (opcional) (ver grupo "otros")
Sintaxis
- Las etiquetas pueden aparecer antes de las declaraciones y al final de las declaraciones compuestas . [40]
- Parámetros sin nombre en definiciones de funciones. [41]
- Inicialización a cero con
{}(incluida la inicialización de VLA). [42] - Las funciones variádicas ya no necesitan un argumento con nombre antes de los puntos suspensivos y la macro
va_startya no necesita un segundo argumento ni evalúa ningún argumento después del primero si está presente. [43] - Añade la sintaxis de atributos al estilo de C 11,[44] usando corchetes dobles [[]] . Además de los atributos de C 11 que se enumeran a continuación, añade nuevos atributos:
[[unsequenced]][45] permite optimizaciones del compilador para funciones que producen salidas repetibles solo en función de sus parámetros[[reproducible]], [45] similar a[[unsequenced]], pero para funciones cuyo orden de llamada también importa
- Añade
_Static_assertcon un solo argumento para mejorar la compatibilidad con C 17 . [46] - Funciones sin argumentos enumerados en su prototipo (por ejemplo,
void foo()) se entienden como si no tomaran argumentos (consulte la eliminación de las declaraciones de funciones al estilo de K&R)
Compatibilidad con C
- Varios cambios en la sintaxis mejoran la compatibilidad con C , como etiquetas antes de las declaraciones, argumentos de funciones sin nombre, inicialización a cero con
{}, funciones variádicas sin argumentos nombrados, atributos al estilo de C 11,_Static_assert(ver Sintaxis). Para las etiquetas al final de declaraciones compuestas se realizó un cambio correspondiente en C 23 . [47] - Añade atributos al estilo de C (ver Sintaxis). Añade los atributos [48] [[ deprecated ]], [49] [[ fallthrough ]], [50] [[ maybe_unused ]], [51] [[ nodiscard ]], [52] y [[ noreturn]] para mejorar la compatibilidad con C 11.
- Marca com obsoletos: _Noreturn, noreturn y el encabezado
(características introducidas en C11) . [53] - Se permiten atributos duplicados por compatibilidad con C 23 . [54] Todos los atributos estándar también pueden estar rodeados por guiones bajos dobles. Por ejemplo [[ __deprecated__ ]] es equivalente a [[ deprecated ]].
- Añade el prefijo
u8a los literales de caracteres para representar la codificación UTF-8 por compatibilidad con C 17 . [55] - Añade las directivas #elifdef y #elifndef, por compatibilidad con C 23 [16] (ver grupo "preprocesador")
Otras características
- Añade soporte para la norma ISO/IEC 60559:2020, la versión actual del estándar IEEE 754 para aritmética de punto flotante, con aritmética de punto flotante binaria extendida y aritmética de punto flotante decimal (opcional). [56] [57]
- El especificador
constexprpara objetos pero no para funciones, a diferencia del equivalente de C . [58] - Añade el tipo
char8_t, para almacenar datos codificados en UTF-8 y cambia el tipo de constantes de caracteresu8y literales de cadena achar8_t. Además, las funcionesmbrtoc8()yc8rtomb()convierten un carácter multibyte estrecho a codificación UTF-8 y un único punto de código de UTF-8 a una representación de carácter multibyte respectivamente. [59] - Aclarar que todos las cadenas y los literales
char16_tse codificarán en UTF-16 y todas las cadenas y los literaleschar32_tse codificarán en UTF-32, a menos que se especifique explícitamente lo contrario. [60] - Permitir que los especificadores de clase de almacenamiento aparezcan en las definiciónes literales compuestas (compound literals). [61]
Características obsoletas
Algunas características antiguas se han eliminado del borrador de trabajo de C23:
- Eliminar trígrafos . [62]
- Eliminar las definiciones/declaraciones de funciones al estilo de K&R (sin información sobre los argumentos de la función). [63] [64]
- Eliminar representaciones de números enteros con signo distintos del complemento a dos. Se requerirá una representación entera con signo de complemento a dos . [65]
- Las macros * _HAS_SUBNORM en
. [66]
Compatibilidad de compiladores
Los siguientes compiladores implementan un indicador de compilador experimental para este estándar:
- GCC 9, [67]
- Clang 9.0, [68]
- Pelles C 11.00 [69]
Textos disponibles
Al igual que otras ediciones del estándar C, el texto oficial ISO del estándar no está disponible gratuitamente.
El último borrador de trabajo previo al C23 que se hizo público fue el N3096, [6] de fecha 01-04-2023. En los meses posteriores a este borrador, se realizaron cientos de cambios [70] antes de producir el borrador de trabajo N3149 con fecha del 9 de julio de 2023 y el borrador oficial de la norma N3219 con fecha del 22 de febrero de 2024. [70] [71] Ninguno de estos borradores posteriores es público. [70] [71]
En la misma fecha en que se anunció el proyecto de norma N3219, se hizo público un nuevo borrador de trabajo N3220.[4] Si bien este documento se describe oficialmente [71] como un borrador de la futura versión "C2Y" de la norma, el "Informe del editor" adjunto especifica que la N3220 difiere del borrador de la norma C23 N3219 solo por una corrección a una nota al pie en el Anexo K. [71]
Véase también
- Portal:Programación. Contenido relacionado con Programación.
- C 23, C 20, C 17, C 14, C 11, C 03, C 98, versiones del estándar del lenguaje de programación C
- Compatibilidad de C y C
Referencias
Lectura adicional
- N3096 (último borrador de trabajo disponible libremente antes del C23); WG14; abril de 2023. (Descarga gratuita)
- N3149 (borrador de trabajo de la norma C23); WG14; julio de 2023. (no disponible al público)
- N3219 ( Borrador de ISO/IEC 9899:2023 DIS ); WG14; febrero de 2024. (Borrador ISO disponible pero no gratuito)
- ISO/IEC 9899:2024 (norma oficial C23); ISO ; 2024. (planeación de lanzamiento para 2024)
- N3220 (primer borrador de trabajo después del C23; difiere del borrador de norma N3219 solo en una nota al pie); WG14; febrero de 2024. (Descarga gratuita)
Enlaces externos
- Grupo de trabajo 14 del lenguaje C
- Repositorio de documentos del WG14
- Reuniones del GT14 : agenda y actas
- Cartas del GT14: Carta C2x, Carta C23, Interpretación de la Carta C23, Carta estándar C

![Neu in 9.0 [5] Halbautomatische Properties in C 13.0 heise online](https://heise.cloudimg.io/width/1008/q70.png-lossy-70.webp-lossy-70.foil1/_www-heise-de_/imgs/18/4/7/8/1/9/9/0/csharp_sign-60de3fd8607ddaaf.jpeg)

