C11 (Estándar de C)
revisión del estándar del lenguaje de programación C, publicada en 2011
From Wikipedia, the free encyclopedia
C11 (formalmente conocido como ISO/IEC 9899:2011 [1]) es un estándar para el lenguaje de programación C. Reemplazó a C99 y fue reemplazado por C17.
C11 estandariza características ya soportadas por los compiladores del momento e incluye un modelo de memoria detallado para soportar la programación multi-hilo. Debido a la tardía disponibilidad de implementaciones conformes con C99, C11 hace que ciertas características sean opcionales, para facilitar el cumplimiento del estándar del lenguaje central. [2][3]
El borrador final, N1570, se publicó en abril de 2011. La nueva norma pasó su revisión 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.
Se define una macro estándar __STDC_VERSION__ con el valor 201112L para indicar que el compilador soporta el estándar C11. [4]
| Predecesor: C99 |
Estándares de C |
Sucesor: C17 |
Cambios respecto a C99
El estándar incluye varios cambios en las especificaciones del lenguaje y de la biblioteca C99, como:
- Especificación de alineamiento (
_Alignas,_Alignof,aligned_allocy<stdalign.h>) - Especificador de función
_Noreturny el encabezado<stdnoreturn.h> - Expresiones genéricas, usando la palabra clave
_Generic. 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 programación multi-hilo
- Especificador de clase de almacenamiento
_Thread_local - Encabezado
<threads.h>que incluye funciones de creación/administración de hilos, mutex, variable de condición y funcionalidad de almacenamiento específica para los hilos - Encabezado
<stdatomic.h>[5] para operaciones atómicas que admiten el modelo de memoria de C11
- Especificador de clase de almacenamiento
- Mejora la compatibilidad con Unicode basándose en el Informe técnico Unicode C ISO/IEC TR 19769:2004 (tipos
char16_tychar32_tpara almacenar datos codificados en UTF-16 / UTF-32, incluidas las funciones de conversión en<uchar.h>y los prefijos literales de cadenauyUcorrespondientes, así como el prefijou8para literales codificados en UTF-8 ). - Eliminación de la función
gets(a favor defgets, más segura), que quedó obsoleta en la revisión anterior del estándar de lenguaje C, ISO/IEC 9899:1999/Cor.3:2007(E). - Interfaces de comprobación de límites (Anexo K). [6]
- Características de analizabilidad (Anexo L).
- Más macros para consultar las características de los tipos de punto flotante, en relación con los números de punto flotante subnormales y la cantidad de dígitos decimales que el tipo puede almacenar.
- Estructuras y uniones anónimas, útiles cuando las uniones y estructuras están anidadas, por ejemplo en
struct T { int tag; union { float x; int n; }; };. - Aserciones estáticas, que se evalúan durante la compilación.
- Un modo exclusivo de creación y apertura (sufijo
"…x") parafopen. Esto se comporta comoO_CREAT|O_EXCLen POSIX, que se utiliza comúnmente para archivos de bloqueo . - La función
quick_exitcomo tercera forma de terminar un programa, destinada a realizar al menos una desinicialización mínima. [7] - Una nueva función
timespec_gety una estructura correspondiente en<time.h>con un grado de compatibilidad POSIX . - Macros para la construcción de números complejos (en parte porque
real + imaginary*Ipodría no producir el valor esperado siimaginaryes infinito o NaN ).
Características opcionales
Esta nueva revisión permite que las implementaciones no soporten ciertas partes del estándar, incluidas algunas que habían sido obligatorias en la revisión de 1999. Los programas pueden usar macros predefinidas para determinar si un compilador admite una determinada característica o no.
| Característica | Macro de prueba de funciones | Disponibilidad en C99 |
|---|---|---|
| Analizabilidad (Anexo L) | __STDC_ANALYZABLE__ |
|
| Interfaces de comprobación de límites (Anexo K) | __STDC_LIB_EXT1__ |
|
Procesamiento multi-hilo ( <threads.h> ) |
__STDC_NO_THREADS__ |
|
Primitivos y tipos atómicos ( <stdatomic.h> y el calificador de tipo _Atomic ) [8] |
__STDC_NO_ATOMICS__ |
|
| Aritmética de punto flotante según IEC 60559 (Anexo F) | __STDC_IEC_559__ |
|
| Aritmética compleja compatible con IEC 60559 (Anexo G) | __STDC_IEC_559_COMPLEX__ |
|
Tipos complejos ( <complex.h> ) |
__STDC_NO_COMPLEX__ |
|
| Arrays de longitud variable | __STDC_NO_VLA__ |
Compatibilidad de los compiladores
Críticas
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 eliminación en la próxima revisión del estándar. Incluso Microsoft, uno de los principales promotores de esta interfaz, no se ajusta a la definición. [13] Además, el Anexo K no incluye las funciones de asignación dinámica (TR24731-2) más útiles, como vasprintf y open_memstream . [14] Las pocas implementaciones de código abierto incluyen la biblioteca "Safer C" de Open Watcom C/C++ [15] y safeclib. [16]