C11 (anteriormente C1X ) es un nombre informal para ISO/IEC 9899:2011 , [1] un estándar anterior para el lenguaje de programación C. Reemplazó al C99 (estándar ISO/IEC 9899:1999) y ha sido reemplazado por el C17 (estándar ISO/IEC 9899:2018). C11 estandariza principalmente características que ya son compatibles con los compiladores contemporáneos comunes e incluye un modelo de memoria detallado para admitir mejor múltiples subprocesos de ejecución. Debido al retraso en la disponibilidad de implementaciones conformes a C99, C11 hace que ciertas funciones sean opcionales para facilitar el cumplimiento del estándar del lenguaje central. [2] [3]
El borrador final, N1570, [4] se publicó en abril de 2011. La nueva norma pasó 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, con no hay comentarios que requieran resolución por parte de los organismos nacionales participantes.
__STDC_VERSION__
Se define una macro estándar con un valor 201112L
para indicar que la compatibilidad con C11 está disponible. [5]
El estándar incluye varios cambios en el lenguaje C99 y las especificaciones de la biblioteca, como [6]
_Alignas
especificador, _Alignof
operador, aligned_alloc
función, <stdalign.h>
encabezado)_Noreturn
especificador de función y el <stdnoreturn.h>
encabezado._Generic
palabra clave. Por ejemplo, la siguiente macro cbrt(x)
se traduce como cbrtl(x)
o cbrt(x)
según cbrtf(x)
el tipo de x
:#define cbrt(x) _Generic((x), doble largo: cbrtl, \ default: cbrt, \ float: cbrtf)(x)
_Thread_local
( especificador de clase de almacenamiento, <threads.h>
encabezado que incluye funciones de creación/administración de subprocesos, mutex , variable de condición y funcionalidad de almacenamiento específica de subprocesos , así como <stdatomic.h>
[7] para operaciones atómicas que admiten el modelo de memoria C11).char16_t
y char32_t
tipos para almacenar datos codificados UTF-16 / UTF-32 , incluidas funciones de conversión y <uchar.h>
los prefijos literales de cadena correspondientes , así como el prefijo para Literales codificados en UTF-8 ). [8]u
U
u8
gets
función (a favor de más segura fgets
), que quedó obsoleta en la revisión anterior del estándar del lenguaje C, ISO/IEC 9899:1999/Cor.3:2007(E).struct T { int tag; union { float x; int n; }; };
#if
y #error
, cuando el traductor comprende los tipos."…x"
sufijo) para fopen
. Esto se comporta como O_CREAT|O_EXCL
en POSIX , que se usa comúnmente para bloquear archivos .quick_exit
función como tercera forma de finalizar un programa, pretende realizar al menos una desinicialización mínima. [10]timespec_get
función y estructura correspondiente <time.h>
con cierto grado de compatibilidad con POSIX .real + imaginary*I
podrían no producir el valor esperado si imaginary
es infinito o NaN ). [11]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.
Algunas características de C11 son compatibles con GCC a partir de la versión 4.6, [16] Clang a partir de la versión 3.1, [17] IBM XL C a partir de la versión 12.1, [18] y Microsoft Visual C++ a partir de VS 2019 (16.8) [19 ] en septiembre de 2020.
Las interfaces opcionales de verificación de límites (Anexo K) siguen siendo controvertidas y no se han implementado ampliamente, y se ha propuesto su desaprobación o eliminación de la próxima revisión estándar. [20] Incluso Microsoft, uno de los principales defensores de esta interfaz, no se ajusta a la definición. [21] Además, el Anexo K no incluye las más útiles TR24731-2 (funciones de asignación dinámica), como vasprintf
y open_memstream
. [22] Las pocas implementaciones de código abierto incluyen la biblioteca "Safer C" de Open Watcom C/C++ [23] y safeclib. [24]