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_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
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
- C++23, C++20, C++17, C++14, C++11, C++03, C++98, versiones del estándar del lenguaje de programación C++
- Compatibilidad de C y C++
Referencias
- ↑ «ISO/IEC 9899:2011 - Information technology -- Programming languages -- C». www.iso.org.
- ↑ «Subsetting the C Standard». www.open-std.org.
- ↑ «Subsetting the C Standard». www.open-std.org.
- ↑ «Defect report #411». ISO/IEC JTC1/SC22/WG14 - C. February 2012. Consultado el 4 de mayo de 2012.
- ↑ «Atomic operations library - cppreference.com». en.cppreference.com.
- ↑ Berin Babcock-McConnell. «API02-C. Functions that read or write to or from an array should take an argument to specify the source or target size».
- ↑ «Abandoning a Process». www.open-std.org.
- ↑ «WG14 N1558 Mar 14-18 meeting minutes (draft)».
- ↑ «GCC 4.6 Release Series — Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF)». gcc.gnu.org.
- ↑ «Clang 3.1 Release Notes». llvm.org.
- ↑ «Support for ISO C11 added to IBM XL C/C++ compilers». www.ibm.com. 17 de abril de 2014.
- ↑ «C11 and C17 Standard Support Arriving in MSVC». devblogs.microsoft.com. 14 de septiembre de 2020.
- ↑ Leffler, Jonathan. «c - Do you use the TR 24731 'safe' functions?». Stack Overflow.
- ↑ «c - Do you use the TR 24731 'safe' functions?». Stack Overflow.
- ↑ «Safer C Library - Open Watcom». 3 de mayo de 2015. Archivado desde el original el 3 de mayo de 2015.
- ↑ «safec: Safe C Library - README». rurban.github.io.
Lectura adicional
- N1570 (borrador de trabajo de la norma C11); WG14; 2011. ( versiones HTML y ASCII )
- ISO/IEC 9899:2011 (norma oficial C11); ISO ; 2011.
- API de C segura: solución concisa para el desbordamiento de búfer, The OWASP Foundation, OWASP AppSec, Beijing 2011