C11 (Estándar de C)

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_alloc y <stdalign.h>)
  • Especificador de función _Noreturn y el encabezado <stdnoreturn.h>
  • Expresiones genéricas, usando la palabra clave _Generic . 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 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
  • Mejora la compatibilidad con Unicode basándose en el Informe técnico Unicode C ISO/IEC TR 19769:2004 (tipos char16_t y char32_t para almacenar datos codificados en UTF-16 / UTF-32, incluidas las funciones de conversión en <uchar.h> y los prefijos literales de cadena u y U correspondientes, así como el prefijo u8 para literales codificados en UTF-8 ).
  • Eliminación de la función gets (a favor de fgets, 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" ) para fopen . Esto se comporta como O_CREAT|O_EXCL en POSIX, que se utiliza comúnmente para archivos de bloqueo .
  • La función quick_exit como tercera forma de terminar un programa, destinada a realizar al menos una desinicialización mínima. [7]
  • Una nueva función timespec_get y 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*I podría no producir el valor esperado si imaginary es 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ísticas opcionales en C11
Característica Macro de prueba de funciones Disponibilidad en C99
Analizabilidad (Anexo L) __STDC_ANALYZABLE__ No No disponible
Interfaces de comprobación de límites (Anexo K) __STDC_LIB_EXT1__ No No disponible
Procesamiento multi-hilo ( <threads.h> ) __STDC_NO_THREADS__ No No disponible
Primitivos y tipos atómicos ( <stdatomic.h> y el calificador de tipo _Atomic ) [8] __STDC_NO_ATOMICS__ No No disponible
Aritmética de punto flotante según IEC 60559 (Anexo F) __STDC_IEC_559__ Parcial Opcional
Aritmética compleja compatible con IEC 60559 (Anexo G) __STDC_IEC_559_COMPLEX__ Parcial Opcional
Tipos complejos ( <complex.h> ) __STDC_NO_COMPLEX__ Sí Obligatorio para implementaciones hosteadas
Arrays de longitud variable __STDC_NO_VLA__ Sí Obligatorio


Compatibilidad de los compiladores

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

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]

Véase también

Referencias

Lectura adicional

Enlaces externos