C23 (Estándar de C)

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).

Predecesor:
C17 (Estándar de C)
Estándares de C
Sucesor:
-

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() en <string.h> para borrar información sensible, donde la operación de memoria siempre debe ser realizada, sin importar las optimizaciones. [7]
  • memccpy() en <string.h> para concatenar cadenas de forma eficiente – similar a las extensiones POSIX y SVID.[8]
  • strdup() y strndup() en <string.h> para crear una copia de una cadena – similar a las extensiones POSIX y SVID.[9]
  • memalignment() en <stdlib.h> para determinar el alineamiento de bytes de un puntero.[10]
  • Añade functiones / macros / tipos para trabajar con bits en un nuevo fichero de cabecera <stdbit.h>. Todos empiezan con stdc_ para minimizar conflictos con código existente y librerías de terceros.[11]
    • En las siguientes, sustituye * con uc, us, ui, ul, ull para obtener el nombre de 5 funciones diferentes, o déjalo vacío para una maro genérica.[11]
    • stdc_count_ones*() y stdc_count_zeros*() para contar el número de 1 o 0 en los bits de un valor.[11]
    • stdc_leading_ones*() y stdc_leading_zeros*() para contar el número de 1 o 0 al principio de los bits de un valor.[11]
    • stdc_trailing_ones*() y stdc_trailing_zeros*() para contar el número de 1 o 0 al final de los bits de un valor.[11]
    • stdc_first_leading_one*() y stdc_first_leading_zero*() para buscar el primer bit con un 1 o 0 en los bits de un valor.[11]
    • stdc_first_trailing_one*() y stdc_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]
  • timegm() en <time.h> una estructura time en un valor callendar - similar a las funciones en las librerías glibc y musl.[12]
  • Nuevas funciones en <math.h> basadas en las recomendaciones del estándar IEEE 754-2019 como, por ejemplo, funciones trigonométricas que operan en unidades de y exp10.[13]

Funciones ya existentes

  • Añade el especificador de conversión binaria %b a la familia de funciones printf() . [14]
  • Añade el especificador de conversión binaria %b a la familia de funciones scanf() . [14]
  • Añade soporte de conversión binaria 0b y 0B a las familias de funciones strtol() y wcstol() . [14]
  • Hace que las funciones bsearch, bsearch_s, memchr, strchr, strpbrk, strrchr, strstr y 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_include permitiendo que las directivas del preprocesador verifiquen la disponibilidad de un encabezado. [20]
  • Añade la macro __has_c_attribute permitiendo 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) y unsigned _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() y ckd_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 const con matrices. [28]
  • Estandarización del operador typeof (...) . [29]
  • El significado la palabra clave auto se 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:

  • nullptr para el tipo nullptr_t . [23]
  • Sufijos literales enteros wb y uwb para los tipos _BitInt(N) y unsigned _BitInt(N).[33]​ De esta forma, 6u wb produce un unsigned _BitInt(3) y -6 wb produce un signed _BitInt(4) que tiene tres bits de valor y un bit de signo.
  • Prefijos para constantes literales binarios 0b y 0B,.[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")
  • typeof y typeof_unqual (ver grupo "tipos")
  • nullptr (ver grupo "constantes")
  • constexpr (ver grupo "otros")
  • _Decimal32, _Decimal64, _Decimal128 para 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_start ya 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_assert con 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 <stdnoreturn.h> (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 u8 a 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 constexpr para 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 caracteres u8 y literales de cadena a char8_t . Además, las funciones mbrtoc8() y c8rtomb() 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_t se codificarán en UTF-16 y todas las cadenas y los literales char32_t se 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 <float.h>. [66]

Compatibilidad de compiladores

Los siguientes compiladores implementan un indicador de compilador experimental para este estándar:

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

Referencias

  1. «History of C». cppreference.com. 27 de junio de 2022. Archivado desde el original el 19 de octubre de 2022. 
  2. «WG14-N2086: C2x Charter». open-std.org. 20 de septiembre de 2016. Archivado desde el original el 22 de diciembre de 2022. 
  3. «ISO/IEC PRF 9899». iso.org. Archivado desde el original el 19 de septiembre de 2024. 
  4. a b «ISO/IEC 9899:2024 (en) — N3220 working draft». open-std.org. 22 de febrero de 2024. 
  5. «WG14-N2437: Agenda for October 2019». open-std.org. 21 de octubre de 2019. Archivado desde el original el 5 de marzo de 2021. 
  6. a b «WG14-N3096: Draft for ISO/IEC 9899:2024». open-std.org. 1 de abril de 2023. Archivado desde el original el 2 de abril de 2023. 
  7. «WG14-N2897: memset_explicit()». open-std.org. 27 de diciembre de 2021. Archivado desde el original el 25 de octubre de 2022. 
  8. «WG14-N2349: Toward more efficient string copying and concatenation». open-std.org. 18 de marzo de 2019. Archivado desde el original el 30 de septiembre de 2022. 
  9. «WG14-N2353: strdup() and strndup()». open-std.org. 18 de marzo de 2019. Archivado desde el original el 24 de diciembre de 2022. 
  10. «WG14-N2974: Queryable pointer alignment». open-std.org. 15 de abril de 2022. Archivado desde el original el 13 de octubre de 2022. 
  11. a b c d e f g h i j k «WG14-N3022: Modern Bit Utilities». open-std.org. 6 de julio de 2022. Archivado desde el original el 24 de diciembre de 2022. 
  12. «WG14-N2833: Add timegm() as non-optional part of time.h». open-std.org. 7 de octubre de 2021. Archivado desde el original el 1 de diciembre de 2021. 
  13. See N3096 § B.11 for a useful overview. The functions were added in separate documents: N2488, its updated versions, and its refs.
  14. a b c «WG14-N2630: formatted input/output of binary integer numbers». open-std.org. 1 de enero de 2021. Archivado desde el original el 14 de diciembre de 2022. 
  15. «WG14-N3020: Qualifier-preserving standard library functions». open-std.org. 13 de junio de 2022. Archivado desde el original el 13 de octubre de 2022. 
  16. a b «WG14-N2645: Add support for preprocessing directives #elifdef and #elifndef». open-std.org. 25 de enero de 2020. Archivado desde el original el 28 de noviembre de 2022. 
  17. «GCC 12 Adds Support For New #elifdef #elifndef Directives». phoronix. 12 de mayo de 2021. Archivado desde el original el 27 de diciembre de 2022. 
  18. «WG14-N3017: #embed - a scannable, tooling-friendly binary resource inclusion mechanism». open-std.org. 27 de junio de 2022. Archivado desde el original el 24 de diciembre de 2022. 
  19. «WG14-N2686: #warning». open-std.org. 22 de julio de 2022. Archivado desde el original el 28 de noviembre de 2022. 
  20. «WG14-N2799: __has_include for C». open-std.org. 30 de agosto de 2021. Archivado desde el original el 24 de diciembre de 2022. 
  21. «WG14-N2553: Querying attribute support». open-std.org. 4 de agosto de 2020. Archivado desde el original el 14 de octubre de 2022. 
  22. «WG14-N3033: Comma omission and comma deletion». open-std.org. 20 de julio de 2022. Archivado desde el original el 27 de diciembre de 2022. 
  23. a b «WR14-N3042: Introduce the nullptr constant». open-std.org. 22 de julio de 2022. Archivado desde el original el 24 de diciembre de 2022. 
  24. «WG14-N2763: Adding a Fundamental Type for N-bit integers». open-std.org. 21 de junio de 2021. Archivado desde el original el 27 de diciembre de 2022. 
  25. «WG14-N3035: _BitInt Fixes». open-std.org. 21 de julio de 2022. Archivado desde el original el 13 de octubre de 2022. 
  26. «WG14-N2867: Checked N-Bit Integers». open-std.org. 28 de noviembre de 2021. Archivado desde el original el 14 de diciembre de 2022. 
  27. «WG14-N2778: Variably-Modified Types». open-std.org. 11 de julio de 2021. Archivado desde el original el 22 de diciembre de 2022. 
  28. «WG14-N2607: Compatibility of Pointers to Arrays with Qualifiers». open-std.org. 31 de octubre de 2020. Archivado desde el original el 13 de octubre de 2022. 
  29. «WG14-N2899: Not-so-magic - typeof for C». open-std.org. 21 de enero de 2022. Archivado desde el original el 24 de diciembre de 2022. 
  30. «WG14-N3007: Type inference for object definitions». open-std.org. 10 de junio de 2022. Archivado desde el original el 24 de diciembre de 2022. 
  31. «WG14-N3037: Improved Rules for Tag Compatibility (updates N3032)». 
  32. «C23 is Finished: Here is What is on the Menu». The Pasture (en inglés). 31 de julio de 2022. 
  33. «WG14-N2775: Literal suffixes for bit-precise integers». open-std.org. 13 de julio de 2021. Archivado desde el original el 27 de diciembre de 2022. 
  34. «WG14-N2549: Allow for binary integer constants». open-std.org. 30 de julio de 2020. Archivado desde el original el 22 de diciembre de 2022. 
  35. «WG14-N2626: Digit separators». open-std.org. 15 de diciembre de 2020. Archivado desde el original el 19 de diciembre de 2022. 
  36. «WG14-N3030: Enhancements to Enumerations». open-std.org. 19 de julio de 2022. Archivado desde el original el 26 de noviembre de 2022. 
  37. «WG14-N3029: Improved Normal Enumerations». open-std.org. 19 de julio de 2022. Archivado desde el original el 29 de enero de 2023. 
  38. «WG14-N2935: Make false and true first-class language features». open-std.org. 15 de febrero de 2022. Archivado desde el original el 21 de noviembre de 2022. 
  39. «WG14-N2934: Revise spelling of keywords». open-std.org. 15 de febrero de 2022. Archivado desde el original el 24 de diciembre de 2022. 
  40. «WG14-N2508: Free Positioning of Labels Inside Compound Statements». open-std.org. 28 de marzo de 2020. Archivado desde el original el 27 de diciembre de 2022. 
  41. «WG14-N2510: Allowing unnamed parameters in a function definition». open-std.org. 9 de abril de 2020. Archivado desde el original el 24 de diciembre de 2022. 
  42. «WG14-N2900: Consistent, Warningless, and Intuitive Initialization with {}». open-std.org. 1 de enero de 2022. Archivado desde el original el 27 de diciembre de 2022. 
  43. «WG14-N2975: Relax requirements for variadic parameter lists». open-std.org. 15 de abril de 2022. Archivado desde el original el 28 de noviembre de 2022. 
  44. «WG14-N2335: Attributes in C». open-std.org. 9 de marzo de 2019. Archivado desde el original el 26 de octubre de 2022. 
  45. a b «Unsequenced functions». open-std.org. Consultado el 18 de julio de 2024. 
  46. «WG14-N2265: Harmonizing static_assert with C++». open-std.org. 6 de julio de 2018. Archivado desde el original el 28 de marzo de 2023. 
  47. «Labels at the end of compound statements (C compatibility)». 13 de enero de 2022. 
  48. «WG14-N2554: Minor attribute wording cleanups». open-std.org. 4 de agosto de 2020. Archivado desde el original el 28 de noviembre de 2022. 
  49. «WG14-N2334: The deprecated attribute». open-std.org. 22 de enero de 2019. Archivado desde el original el 19 de octubre de 2022. 
  50. «WG14-N2408: The fallthrough attribute». open-std.org. 11 de agosto de 2019. Archivado desde el original el 25 de diciembre de 2022. 
  51. «WG14-N2270: The maybe_unused attribute». open-std.org. 6 de julio de 2018. Archivado desde el original el 25 de diciembre de 2022. 
  52. «WG14-N2267: The nodiscard attribute». open-std.org. 6 de julio de 2018. Archivado desde el original el 19 de octubre de 2022. 
  53. «WG14-N2764: The noreturn attribute». open-std.org. 21 de junio de 2021. Archivado desde el original el 25 de diciembre de 2022. 
  54. «WG14-N2557: Allow Duplicate Attributes». open-std.org. 1 de septiembre de 2020. Archivado desde el original el 28 de noviembre de 2022. 
  55. «WG14-N2418: Adding the u8 character prefix». open-std.org. 2 de septiembre de 2019. Archivado desde el original el 13 de enero de 2023. 
  56. «WG14-N2341: ISO/IEC TS 18661-2 - Floating-point extensions for C - Part 2: Decimal floating-point arithmetic». open-std.org. 26 de febrero de 2019. Archivado desde el original el 21 de noviembre de 2022. 
  57. «WG14-N2601: Annex X - IEC 60559 interchange and extended types». open-std.org. 15 de octubre de 2020. Archivado desde el original el 14 de octubre de 2022. 
  58. «WG14-N3018: The constexpr specifier for object definitions». open-std.org. 6 de julio de 2022. Archivado desde el original el 24 de diciembre de 2022. 
  59. «WG14-N2653: char8_t: A type for UTF-8 characters and strings (Revision 1)». open-std.org. 4 de junio de 2021. Archivado desde el original el 27 de mayo de 2023. 
  60. «WG14-N2728: char16_t & char32_t string literals shall be UTF-16 & UTF-32». open-std.org. 15 de mayo de 2021. Archivado desde el original el 27 de mayo de 2023. 
  61. «WG14-N3038: Introduce storage-class specifiers for compound literals». open-std.org. 21 de julio de 2022. Archivado desde el original el 26 de noviembre de 2022. 
  62. «WG14-N2940: Removing trigraphs??!». open-std.org. 2 de marzo de 2022. Archivado desde el original el 26 de octubre de 2022. 
  63. «WG14-N2432: Remove support for function definitions with identifier lists proposal». open-std.org. 25 de septiembre de 2019. Archivado desde el original el 27 de diciembre de 2022. 
  64. «WG14-N2841: No function declarators without prototypes». open-std.org. 10 de octubre de 2021. Archivado desde el original el 12 de noviembre de 2022. 
  65. «WG14-N2412: Two's complement sign representation». open-std.org. 11 de agosto de 2019. Archivado desde el original el 27 de diciembre de 2022. 
  66. «WG14-N2993: Make *_HAS_SUBNORM be obsolescent». open-std.org. 6 de junio de 2022. Archivado desde el original el 5 de diciembre de 2022. 
  67. «GCC 9 Release Notes». GNU Project. Archivado desde el original el 27 de diciembre de 2022. 
  68. «Clang 9.0 - add new language mode for C2x». LLVM Project Repository. 14 de mayo de 2019. Archivado desde el original el 27 de diciembre de 2022. 
  69. «Pelles C - major changes between 10.00 and 11.00». smorgasbordet.com. Archivado desde el original el 27 de diciembre de 2022. 
  70. a b c «N3150 - Editor's Report, Post January-February 2023 Meeting». open-std.org. 8 de julio de 2023. 
  71. a b c d «N3221 - Editor's Report, Post January 2024 Meeting». open-std.org. 15 de febrero de 2024. 

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