C11 (antes C1X ) es un nombre informal para la norma ISO / IEC 9899: 2011 , [1] un pasado estándar 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 compiladores contemporáneos comunes e incluye un modelo de memoria detallado para soportar mejor múltiples subprocesos de ejecución. Debido a la demora en la disponibilidad de las implementaciones que cumplen con C99, C11 hace que ciertas características sean opcionales, para facilitar el cumplimiento del estándar de lenguaje central. [2] [3]
El borrador final, N1570, [4] se publicó en abril de 2011. El nuevo estándar pasó su revisión del borrador final el 10 de octubre de 2011 y fue ratificado oficialmente por ISO y publicado como ISO / IEC 9899: 2011 el 8 de diciembre de 2011, con sin comentarios que requieran resolución por parte de los organismos nacionales participantes.
Una macro estándar __STDC_VERSION__
se define con un valor 201112L
para indicar que el soporte C11 está disponible. [5] Algunas características de C11 son compatibles con GCC a partir de la versión 4.6, [6] Clang a partir de la versión 3.1, [7] IBM XL C a partir de la versión 12.1, [8] y Microsoft Visual C ++ a partir de VS 2019 (16.8 ) [9] en septiembre de 2020.
Cambios de C99
El estándar incluye varios cambios en el lenguaje C99 y las especificaciones de la biblioteca, tales como: [10]
- Especificación de alineación (
_Alignas
especificador,_Alignof
operador,aligned_alloc
función,
encabezado) - El
_Noreturn
especificador de función y el
encabezado - Expresiones de tipo genérico utilizando la
_Generic
palabra clave. Por ejemplo, la siguiente macro secbrt(x)
traduce encbrtl(x)
,cbrt(x)
ocbrtf(x)
según el tipo dex
:
#define cbrt (x) _Generic ((x), long double: cbrtl, \ default: cbrt, \ float: cbrtf) (x)
- Soporte de subprocesos múltiples (
_Thread_local
especificador de clase de almacenamiento,
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
[11] para operaciones atómicas que admiten el modelo de memoria C11). - Mejora Unicode apoyo basado en el Informe C Unicode Técnica ISO / IEC TR 19769: 2004 (
char16_t
ychar32_t
tipos para el almacenamiento de UTF-16 / UTF-32 datos codificados, incluyendo funciones de conversión en
y de los correspondientesu
yU
de cadena prefijos literales, así como elu8
prefijo para Literales codificados en UTF-8 ). [12] - Eliminación de la
gets
función (en favor de una función más segurafgets
), que quedó en desuso en la revisión del estándar de lenguaje C anterior, ISO / IEC 9899: 1999 / Cor.3: 2007 (E). - Interfaces de verificación de límites (Anexo K). [13]
- Características de analizabilidad (Anexo L).
- Más macros para consultar las características de los tipos de punto flotante, con respecto a los números de punto flotante subnormales y el número de dígitos decimales que el tipo puede almacenar.
- Estructuras y uniones anónimas , útiles cuando uniones y estructuras están anidadas, por ejemplo, en .
struct T { int tag; union { float x; int n; }; };
- Afirmaciones estáticas , que se evalúan durante la traducción en una fase posterior a
#if
y#error
, cuando el traductor comprende los tipos. - Un modo exclusivo de creación y apertura (
"…x"
sufijo) parafopen
. Esto se comporta comoO_CREAT|O_EXCL
en POSIX , que se usa comúnmente para archivos de bloqueo . - La
quick_exit
función como una tercera forma de terminar un programa, destinada a realizar al menos una desinicialización mínima siexit
falla la terminación con . [14] - Una nueva
timespec_get
función y estructura correspondiente
con cierto grado de compatibilidad POSIX . - Macros para la construcción de valores complejos (en parte porque
real + imaginary*I
podría no producir el valor esperado siimaginary
es infinito o NaN ). [15]
Características opcionales
La nueva revisión permite que las implementaciones no admitan ciertas partes del estándar, incluidas algunas que habían sido obligatorias para admitir en la revisión de 1999. [16] Los programas pueden utilizar macros predefinidas para determinar si una implementación admite una determinada función o no.
Característica | Macro de prueba de funciones | Disponibilidad en C99 [17] |
---|---|---|
Analizabilidad (Anexo L) | __STDC_ANALYZABLE__ | No disponible |
Interfaces de verificación de límites (anexo K) | __STDC_LIB_EXT1__ | No disponible |
Subprocesos múltiples ( ) | __STDC_NO_THREADS__ | No disponible |
Primitivas y tipos atómicos ( y el _Atomic calificador de tipo) [18] | __STDC_NO_ATOMICS__ | No disponible |
Aritmética de coma flotante IEC 60559 (Anexo F) | __STDC_IEC_559__ | Opcional |
Aritmética compleja compatible con IEC 60559 (Anexo G) | __STDC_IEC_559_COMPLEX__ | Opcional |
Tipos complejos ( ) | __STDC_NO_COMPLEX__ | Obligatorio para implementaciones alojadas |
Matrices de longitud variable [19] | __STDC_NO_VLA__ | Obligatorio |
Crítica
Las interfaces de verificación de límites opcionales (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 los TR24731-2 (funciones de asignación dinámica) más útiles, 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]
Ver también
- 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 - tecnología de la información - lenguajes de programación - C" . www.iso.org .
- ^ "WG14 N1250 La Carta C1X" (PDF) .
- ^ "Subconjunto del estándar C" . www.open-std.org .
- ^ Borrador del Comité WG14 N1570 - 12 de abril de 2011
- ^ "Informe de defectos # 411" . ISO / IEC JTC1 / SC22 / WG14 - C. Febrero de 2012 . Consultado el 4 de mayo de 2012 .
- ^ "Serie de versiones GCC 4.6 - Cambios, nuevas funciones y correcciones - Proyecto GNU - Free Software Foundation (FSF)" . gcc.gnu.org .
- ^ "Notas de la versión de Clang 3.1" . llvm.org .
- ^ "Soporte para ISO C11 agregado a compiladores IBM XL C / C ++" . www.ibm.com . 17 de abril de 2014.
- ^ "Soporte estándar C11 y C17 llegando a MSVC" . devblogs.microsoft.com . 14 de septiembre de 2020.
- ^ Borrador del Comité WG14 N1516 - 4 de octubre de 2010
- ^ "Biblioteca de operaciones atómicas - cppreference.com" . en.cppreference.com .
- ^ "WG14 N1286 -" Sobre la compatibilidad con TR-19769 y nuevos tipos de caracteres ", Nick Stoughton, Larry Dwyer" (PDF) .
- ^ Berin Babcock-McConnell. "API02-C. Las funciones que leen o escriben en o desde una matriz deben tomar un argumento para especificar el tamaño de origen o destino" .
- ^ "Abandonar un proceso" . www.open-std.org .
- ^ "Creación de valor complejo" . www.open-std.org .
- ^ Borrador del Comité WG14 N1548 - 2 de diciembre de 2010 6.10.8.3 Macros de características condicionales
- ^ ISO 9899: 1999 6.10.8 Nombres de macro predefinidos
- ^ "WG14 N1558 Actas de la reunión del 14 al 18 de marzo (borrador)" (PDF) .
- ^ ISO 9899: 2011 lenguajes de programación - C 6.7.6.2 4
- ^ "N1969 - Experiencia de campo actualizada con el anexo K - Interfaces de comprobación de límites" . www.open-std.org .
- ^ Leffler, Jonathan. "c - ¿Utiliza las funciones 'seguras' de TR 24731?" . Desbordamiento de pila .
- ^ "c - ¿Utiliza las funciones 'seguras' de TR 24731?" . Desbordamiento de pila .
- ^ "Biblioteca C más segura - Abrir Watcom" . 3 de mayo de 2015.
- ^ "safec: Biblioteca C segura - LÉAME" . rurban.github.io .
enlaces externos
- La Carta C1X
- N1570 , el borrador final de C1X, de fecha 12 de abril de 2011
- Sitio web oficial del Grupo de trabajo ISO C
- El borrador estándar en ASCII simple y formularios HTML vinculados, además del PDF.
- Biblioteca C segura de API limitadas
- Plum, Thomas (6 de abril de 2012). "C finalmente obtiene un nuevo estándar" . Diario del Dr. Dobb .
- Safe C API: solución concisa de desbordamiento de búfer, The OWASP Foundation, OWASP AppSec, Beijing 2011
Precedido por C99 | Estándares del lenguaje C | Sucedido por C17 |