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 macrocbrt(x)se traduce acbrtl(x),cbrt(x)ocbrtf(x)dependiendo del tipo dex:
#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_tychar32_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 segurafgets), 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) parafopen. Esto se comporta comoO_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 siimaginaryes 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
- ↑ "ISO/IEC 9899:2011 - Tecnología de la información - Lenguajes de programación - C" . www.iso.org .
- ↑ "WG14 N1250 La Carta C1X" (PDF) .
- ↑ "Subconjuntos del estándar C" . www.open-std.org .
- ↑ Borrador del Comité WG14 N1570 — 12 de abril de 2011
- ↑ "Informe de defectos n.º 411" . ISO/IEC JTC1/SC22/WG14 - C. Febrero de 2012. Consultado el 4 de mayo de 2012 .
- ↑ Borrador del Comité WG14 N1516 — 4 de octubre de 2010
- ↑ "Biblioteca de operaciones atómicas - cppreference.com" . en.cppreference.com .
- ↑ "WG14 N1286 — "Sobre el soporte para TR-19769 y nuevos tipos de caracteres", Nick Stoughton, Larry Dwyer" (PDF) .
- ↑ 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" .
- ↑ "Abandonar un proceso" . www.open-std.org .
- ↑ "Creación de valor complejo" . www.open-std.org .
- ↑ Borrador del Comité WG14 N1548 — 2 de diciembre de 2010 6.10.8.3 Macros de características condicionales
- ↑ "Actas de la reunión del Grupo de Trabajo 14 N1558 del 14 al 18 de marzo (borrador)" (PDF) .
- ↑ ISO 9899:2011 Lenguajes de programación - C 6.7.6.2 4
- ↑ "Serie de lanzamientos de GCC 4.6: cambios, nuevas características y correcciones - Proyecto GNU - Fundación del Software Libre (FSF)" . gcc.gnu.org .
- ↑ "Notas de la versión Clang 3.1" . llvm.org .
- ↑ "Se agregó compatibilidad con ISO C11 a los compiladores IBM XL C/C++" . www.ibm.com . 17 de abril de 2014.
- ↑ "Llega la compatibilidad con los estándares C11 y C17 a MSVC" . devblogs.microsoft.com . 14 de septiembre de 2020.
- ↑ "N1969 — Experiencia de campo actualizada con el Anexo K — Interfaces de verificación de límites" . www.open-std.org .
- ↑ Leffler, Jonathan. "c - ¿Utilizas las funciones 'seguras' de TR 24731?" . Stack Overflow .
- ↑ "c - ¿Utiliza las funciones 'seguras' de TR 24731?" . Stack Overflow .
- ↑ "Biblioteca C más segura - Open Watcom" . 3 de mayo de 2015. Archivado del original el 3 de mayo de 2015.
- ↑ "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
Enlaces externos
- Documentos del Grupo de Trabajo 14 (GT14) del Lenguaje C
- Carta C1X - Grupo de Trabajo 14
- Biblioteca C segura de API limitadas
- C (lenguaje de programación)
- estándares de lenguajes de programación
- Normas IEC
- normas ISO