Articulo de referencia

C11 (revisión del estándar C)

C11 (anteriormente C1X , formalmente ISO/IEC 9899:2011 [ 1 ] ) es un estándar anterior para el lenguaje de programación C. Reemplazó a C99 (estándar ISO/IEC 9899:1999) y fue ree...

C11 (anteriormente C1X , formalmente ISO/IEC 9899:2011 [ 1 ] ) es un estándar anterior para el lenguaje de programación C. Reemplazó a C99 (estándar ISO/IEC 9899:1999) y fue reemplazado por C17 (estándar ISO/IEC 9899:2018). C11 estandariza principalmente características ya compatibles con los compiladores contemporáneos comunes e incluye un modelo de memoria detallado para brindar un mejor soporte a la ejecución de múltiples hilos . Debido a la disponibilidad tardía de implementaciones de C99 conformes, C11 hace que ciertas características sean opcionales para facilitar el cumplimiento del estándar del lenguaje principal. [ 2 ] [ 3 ]

El borrador final, N1570, [ 4 ] se publicó en abril de 2011. La nueva norma superó su revisión del borrador final el 10 de octubre de 2011 y fue ratificada oficialmente por ISO y publicada como ISO/IEC 9899:2011 el 8 de diciembre de 2011, sin comentarios que requirieran resolución por parte de los organismos nacionales participantes.

__STDC_VERSION__Se define una macro estándar con un valor 201112Lpara indicar que el soporte para C11 está disponible. [ 5 ]

Cambios respecto a C99

El estándar incluye varios cambios en las especificaciones del lenguaje y la biblioteca C99 , como [ 6 ].

  • Especificación de alineación ( _Alignasespecificador, _Alignofoperador, aligned_allocfunción, encabezado)<stdalign.h>
  • El _Noreturnespecificador de función y el encabezado<stdnoreturn.h>
  • Expresiones genéricas de tipo usando la _Genericpalabra clave. Por ejemplo, la siguiente macro cbrt(x)se traduce a cbrtl(x), cbrt(x)o cbrtf(x)dependiendo del tipo de x:
#define cbrt(x) _Generic((x), long double: cbrtl, \  default: cbrt, \  float: cbrtf)(x)
  • Soporte para multihilo_Thread_local ( especificador de clase de almacenamiento, encabezado que incluye funciones de creación/gestión de subprocesos, mutex , variable de condición y funcionalidad de almacenamiento específica del subproceso , así como [ 7 ] para operaciones atómicas que admiten el modelo de memoria C11).<threads.h><stdatomic.h>
  • Soporte Unicode mejorado basado en el Informe Técnico Unicode C ISO/IEC TR 19769:2004 ( char16_ty char32_ttipos para almacenar datos codificados en UTF-16 / UTF-32 , incluidas funciones de conversión en y los prefijos literales de cadena correspondientes, así como el prefijo para literales codificados en UTF-8 ). [ 8 ]<uchar.h>uUu8
  • Eliminación de la getsfunción (a favor de una más segura fgets), que fue descontinuada en la revisión anterior del estándar del lenguaje C, ISO/IEC 9899:1999/Cor.3:2007(E).
  • Interfaces de comprobación de límites (Anexo K). [ 9 ]
  • Características de analizabilidad (Anexo L).
  • Más macros para consultar las características de los tipos de punto flotante, en lo que respecta a los números de punto flotante subnormales y la cantidad de dígitos decimales que el tipo puede almacenar.
  • Estructura anónima y miembros del sindicato dentro de estructuras o sindicatos que contienen, por ejemplo en
struct MyStruct { int tag ; union { float f ; int n ; }; struct { int x ; int y ; }; };
  • Las aserciones estáticas , que se evalúan durante la traducción en una fase posterior a la de #ify #error, cuando el traductor entiende los tipos.
  • Un modo exclusivo de creación y apertura ( "…x"sufijo) para fopen. Esto se comporta como O_CREAT|O_EXCLen POSIX , que se usa comúnmente para archivos de bloqueo .
  • La quick_exitfunción como una tercera forma de terminar un programa, destinada a realizar al menos una desinicialización mínima. [ 10 ]
  • Una nueva timespec_getfunción y su estructura correspondiente, con cierto grado de compatibilidad con POSIX .<time.h>
  • Macros para la construcción de valores complejos (en parte porque real + imaginary*Ipodrían no producir el valor esperado si imaginaryes infinito o NaN ). [ 11 ]

Características opcionales

La nueva revisión permite que las implementaciones no admitan ciertas partes del estándar, incluidas algunas que eran obligatorias en la revisión de 1999. [ 12 ] Los programas pueden usar macros predefinidas para determinar si una implementación admite una determinada característica o no.

Soporte del compilador

Algunas características de C11 son compatibles con GCC a partir de la versión 4.6, [ 15 ] Clang a partir de la versión 3.1, [ 16 ] IBM XL C a partir de la versión 12.1, [ 17 ] y Microsoft Visual C++ a partir de VS 2019 (16.8) [ 18 ] en septiembre de 2020.

Crítica

Las interfaces opcionales de comprobación de límites (Anexo K) siguen siendo controvertidas y no se han implementado ampliamente, y se ha propuesto su desuso o eliminación en la próxima revisión del estándar. [ 19 ] Incluso Microsoft, uno de los principales defensores de esta interfaz, no se ajusta a la definición. [ 20 ] Además, el Anexo K no incluye las funciones más útiles TR24731-2 (funciones de asignación dinámica), como vasprintfy open_memstream. [ 21 ] Las pocas implementaciones de código abierto incluyen la biblioteca "Safer C" de Open Watcom C/C++ [ 22 ] y safeclib. [ 23 ]

Véase también

Referencias

  1. "ISO/IEC 9899:2011 - Tecnología de la información - Lenguajes de programación - C" . www.iso.org .
  2. "WG14 N1250 La Carta C1X" (PDF) .
  3. "Subconjuntos del estándar C" . www.open-std.org .
  4. Borrador del Comité WG14 N1570 — 12 de abril de 2011
  5. "Informe de defectos n.º 411" . ISO/IEC JTC1/SC22/WG14 - C. Febrero de 2012. Consultado el 4 de mayo de 2012 .
  6. Borrador del Comité WG14 N1516 — 4 de octubre de 2010
  7. "Biblioteca de operaciones atómicas - cppreference.com" . en.cppreference.com .
  8. "WG14 N1286 — "Sobre el soporte para TR-19769 y nuevos tipos de caracteres", Nick Stoughton, Larry Dwyer" (PDF) .
  9. Berin Babcock-McConnell. "API02-C. Las funciones que leen o escriben en o desde una matriz deben tomar un argumento para especificar el tamaño de origen o destino" .
  10. "Abandonar un proceso" . www.open-std.org .
  11. "Creación de valor complejo" . www.open-std.org .
  12. Borrador del Comité WG14 N1548 — 2 de diciembre de 2010 6.10.8.3 Macros de características condicionales
  13. "Actas de la reunión del Grupo de Trabajo 14 N1558 del 14 al 18 de marzo (borrador)" (PDF) .
  14. ISO 9899:2011 Lenguajes de programación - C 6.7.6.2 4
  15. "Serie de lanzamientos de GCC 4.6: cambios, nuevas características y correcciones - Proyecto GNU - Fundación del Software Libre (FSF)" . gcc.gnu.org .
  16. "Notas de la versión Clang 3.1" . llvm.org .
  17. "Se agregó compatibilidad con ISO C11 a los compiladores IBM XL C/C++" . www.ibm.com . 17 de abril de 2014.
  18. "Llega la compatibilidad con los estándares C11 y C17 a MSVC" . devblogs.microsoft.com . 14 de septiembre de 2020.
  19. "N1969 — Experiencia de campo actualizada con el Anexo K — Interfaces de verificación de límites" . www.open-std.org .
  20. Leffler, Jonathan. "c - ¿Utilizas las funciones 'seguras' de TR 24731?" . Stack Overflow .
  21. "c - ¿Utiliza las funciones 'seguras' de TR 24731?" . Stack Overflow .
  22. "Biblioteca C más segura - Open Watcom" . 3 de mayo de 2015. Archivado del original el 3 de mayo de 2015.
  23. "safec: Biblioteca C segura - README" . rurban.github.io .

Lecturas adicionales

  • N1570 (borrador de trabajo del estándar C11); WG14; 2011. ( Versiones HTML y ASCII )
  • ISO/IEC 9899:2011 (norma oficial C11); ISO ; 2011.
  • Plum, Thomas (6 de abril de 2012). "C finalmente obtiene un nuevo estándar" . Dr. Dobb's Journal .
  • API segura de C: solución concisa para el desbordamiento de búfer, Fundación OWASP, OWASP AppSec, Pekín 2011
  • Documentos del Grupo de Trabajo 14 (GT14) del Lenguaje C
  • Carta C1X - Grupo de Trabajo 14
  • Biblioteca C segura de API limitadas