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 ha sido reemplazado por 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 brindar un mejor soporte a múltiples subprocesos de ejecución. Debido a la disponibilidad tardía de implementaciones conformes con C99, C11 hace que ciertas características sean opcionales, para que sea más fácil cumplir con el 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 de 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 201112L
para indicar que está disponible el soporte de C11. [5]
El estándar incluye varios cambios en las especificaciones del lenguaje y la biblioteca C99 , 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)
, cbrt(x)
o cbrtf(x)
según el tipo de x
:#define cbrt(x) _Generic((x), largo doble: cbrtl, \ predeterminado: cbrt, \ flotante: 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 del subproceso , 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 en UTF-16 / UTF-32<uchar.h>
, incluidas las funciones de conversión en y los prefijos literales u
de U
cadena correspondientes, así como el u8
prefijo para literales codificados en UTF-8 ). [8]gets
función (a favor de safer fgets
), que quedó obsoleta en la revisión anterior del estándar de 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 utiliza comúnmente para archivos bloqueados .quick_exit
función como tercera vía para terminar un programa, pretende realizar al menos una desinicialización mínima. [10]timespec_get
función y estructura correspondiente <time.h>
con un 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 habían sido 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 de comprobación de límites opcionales (Anexo K) siguen siendo controvertidas y no se han implementado ampliamente, y se ha propuesto su desuso o eliminación de la próxima revisión estándar. [20] Incluso Microsoft, un defensor principal de esta interfaz, no se ajusta a la definición. [21] Además, el Anexo K no incluye el más útil 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]