Estándares para el lenguaje de programación C
ANSI C , ISO C y Standard C son estándares sucesivos para el lenguaje de programación C publicados por el Instituto Nacional Estadounidense de Estándares (ANSI) e ISO/IEC JTC 1/SC 22 /WG 14 de la Organización Internacional de Normalización (ISO) y la Comisión Electrotécnica Internacional (IEC). Históricamente, los nombres se referían específicamente a la versión original y con mejor soporte del estándar (conocida como C89 o C90 ). Se anima a los desarrolladores de software que escriben en C a que cumplan con los estándares, ya que hacerlo ayuda a la portabilidad entre compiladores.
Historia y perspectivas
El primer estándar para C fue publicado por ANSI. Aunque este documento fue posteriormente adoptado por ISO/IEC y las revisiones posteriores publicadas por ISO/IEC han sido adoptadas por ANSI, "ANSI C" todavía se utiliza para referirse al estándar. [1] Mientras que algunos desarrolladores de software utilizan el término ISO C, otros son neutrales respecto de los organismos de normalización y utilizan el Estándar C.
Especificación informal en 1978 ( libro de Brian Kernighan y Dennis Ritchie El lenguaje de programación C ).
Estandarización C
En 1983, el Instituto Nacional Estadounidense de Estándares formó un comité, X3J11, para establecer una especificación estándar de C. En 1985, se publicó el primer borrador de estándar, a veces denominado C85 . En 1986, se publicó otro borrador de estándar, a veces denominado C86 . El estándar C preliminar se publicó en 1988, y a veces denominado C88 . [2]
C89
El estándar ANSI se completó en 1989 y se ratificó como ANSI X3.159-1989 "Lenguaje de programación C". Esta versión del lenguaje se conoce a menudo como "ANSI C". Más adelante, a veces se utiliza la etiqueta "C89" para distinguirlo de C90, pero utilizando el mismo método de etiquetado.
C90
La misma norma que C89 fue ratificada por la ISO/IEC como ISO/IEC 9899:1990, con solo cambios de formato, [3] a la que a veces se hace referencia como C90. Por lo tanto, los términos "C89" y "C90" se refieren a un lenguaje que es prácticamente idéntico.
Esta norma ha sido retirada tanto por ANSI/INCITS [4] como por ISO/IEC. [5]
C95
En 1995, la ISO / IEC publicó una extensión, llamada Enmienda 1, para el estándar C. Su nombre completo finalmente fue ISO/IEC 9899:1990/AMD1:1995 o apodado C95 . Además de la corrección de errores, hubo otros cambios en las capacidades del lenguaje, [6] [7] como:
- Se mejoró el soporte de caracteres anchos y multibyte en la biblioteca estándar, introduciendo así como también E/S multibyte .
<wchar.h>
<wctype.h>
- Adición de dígrafos al lenguaje
- Especificación de macros estándar para la especificación alternativa de operadores, por ejemplo
and
para&&
- Especificación de la macro estándar
__STDC_VERSION__
Además de la enmienda, ISO publicó dos corrigendos técnicos para C90:
- ISO/IEC 9899:1990/Cor 1:1994 TCOR1 en 1994 [8]
- ISO/IEC 9899:1990/Cor 2:1996 en 1996 [9]
Prueba del preprocesador para compatibilidad con C95
#si se define(__STDC_VERSION__) && __STDC_VERSION__ >= 199409L/* Código fuente compatible con C95. */ #elifdefined(__STDC__) /* Código fuente compatible con C89. */ #endif
C99
En marzo de 2000, ANSI adoptó la norma ISO/IEC 9899:1999. [10] Esta norma se conoce comúnmente como C99. Algunas incorporaciones notables a la norma anterior incluyen:
- Nuevos tipos de datos integrados :
long long
, _Bool
, _Complex
, y_Imaginary
- Varias nuevas características del lenguaje central, incluidos índices de matriz estáticos, inicializadores designados, literales compuestos, matrices de longitud variable , miembros de matriz flexibles , macros variádicas y
restrict
palabras clave. - Varios encabezados de biblioteca nuevos, incluidos
stdint.h
, <tgmath.h>
, fenv.h
,<complex.h>
- Compatibilidad mejorada con varias características de C++ , incluidas funciones en línea , comentarios de una sola línea con
//
, mezcla de declaraciones y código, y nombres de caracteres universales en identificadores. - Se eliminaron varias características peligrosas del lenguaje C89, como declaraciones de funciones implícitas y
int
La ISO publicó tres correcciones técnicas para C99:
- ISO/IEC 9899:1999/Cor 1:2001(E)
- ISO/IEC 9899:1999/Cor 2:2004(E)
- ISO/IEC 9899:1999/Cor 3:2007(E), notable por desaprobar la función de biblioteca estándar gets
Esta norma ha sido retirada tanto por ANSI/INCITS [11] como por ISO/IEC [12] en favor de C11.
C11
C11 fue ratificado y publicado oficialmente el 8 de diciembre de 2011. Las características notables incluyen soporte Unicode mejorado , expresiones genéricas de tipo usando la _Generic
palabra clave new, una API multiplataforma de subprocesosthreads.h
múltiples ( ) y soporte de tipos atómicos tanto en el lenguaje principal como en la biblioteca ( stdatomic.h
).
La ISO ha publicado una corrección técnica para C11:
- ISO/IEC 9899:2011/Cor 1:2012 [13]
C17
A partir de octubre de 2018 [actualizar], "C17" es el estándar actual para el lenguaje de programación C. [ 14]
C17 aborda los defectos de C11 sin introducir nuevas características del lenguaje. [15]
C23
C23 es el nombre informal de la próxima revisión importante del estándar del lenguaje C. [16]
Otras publicaciones ISO relacionadas
Como parte del proceso de estandarización, ISO/IEC también publica informes técnicos y especificaciones relacionadas con el lenguaje C:
- ISO/IEC TR 19769:2004, [17] sobre extensiones de biblioteca para soportar formatos de transformación Unicode, integrados en C11
- ISO/IEC TR 24731-1:2007, [18] sobre extensiones de biblioteca para soportar interfaces con límites comprobados, integradas en C11
- ISO/IEC TR 18037:2008, [19] sobre extensiones C integradas
- ISO/IEC TR 24732:2009, [20] sobre aritmética de punto flotante decimal , reemplazada por ISO/IEC TS 18661-2:2015
- ISO/IEC TR 24747:2009, [21] sobre funciones matemáticas especiales,
- ISO/IEC TR 24731-2:2010, [22] sobre extensiones de biblioteca para admitir funciones de asignación dinámica
- ISO/IEC TS 17961:2013, [23] sobre codificación segura en C
- ISO/IEC TS 18661-1:2014, [24] sobre aritmética binaria de punto flotante compatible con IEC 60559:2011
- ISO/IEC TS 18661-2:2015, [25] sobre aritmética de punto flotante decimal compatible con IEC 60559:2011
- ISO/IEC TS 18661-3:2015, [26] sobre tipos de punto flotante extendidos e intercambiables compatibles con IEC 60559:2011
- ISO/IEC TS 18661-4:2015, [27] sobre funciones complementarias compatibles con IEC 60559:2011
Se están desarrollando y a la espera de aprobación más especificaciones técnicas, incluida la quinta y última parte de TS 18661, una especificación de memoria transaccional de software y extensiones de biblioteca paralela. [28]
Soporte de los principales compiladores
ANSI C es ahora compatible con casi todos los compiladores de uso generalizado. GCC y Clang son dos compiladores de C importantes y populares en la actualidad, ambos basados en C11 con actualizaciones que incluyen cambios de especificaciones posteriores como C17. [29] [30] Cualquier código fuente escrito solo en C estándar y sin suposiciones dependientes del hardware tiene virtualmente garantizada una compilación correcta en cualquier plataforma con una implementación de C conforme. Sin tales precauciones, la mayoría de los programas pueden compilarse solo en una determinada plataforma o con un compilador particular, debido, por ejemplo, al uso de bibliotecas no estándar, como bibliotecas GUI , o a la dependencia de atributos específicos del compilador o de la plataforma, como el tamaño exacto de ciertos tipos de datos y el orden de bytes .
Detectabilidad de cumplimiento
Para mitigar las diferencias entre K&R C y el estándar ANSI C, __STDC__
se puede utilizar la macro ("estándar c") para dividir el código en secciones ANSI y K&R.
#si se define(__STDC__) && __STDC__ int externo getopt ( int , char * const * , const char * ); #de lo contrario int externo getopt (); #finsi
En el ejemplo anterior, se utiliza un prototipo en una declaración de función para implementaciones que cumplen con ANSI, mientras que en el resto de los casos se utiliza una declaración obsoleta que no es un prototipo. Estas siguen cumpliendo con ANSI a partir de C99. Observe cómo este código verifica tanto la definición como la evaluación: esto se debe a que algunas implementaciones pueden establecerse __STDC__
en cero para indicar que no cumplen con ANSI. [31]
Compatibilidad con compiladores
Lista de compiladores compatibles con ANSI C:
Véase también
Referencias
- ^ Brad Kelechava (14 de septiembre de 2017). "El origen de ANSI C e ISO C" . Consultado el 14 de agosto de 2018 .
- ^ Richard Hale Shaw (13 de septiembre de 1988). «Estándar C: el borrador ANSI crece». PC Magazine . Vol. 7, núm. 15. págs. 116–117 . Consultado el 15 de noviembre de 2022 .
- ^ "Estándares - Uso de la Colección de compiladores GNU (GCC)" . Consultado el 24 de junio de 2012 .
- ^ "INCITS/ISO/IEC 9899". www.techstreet.com . Consultado el 3 de octubre de 2018 .
- ^ "ISO/IEC 9899:1990 - Lenguajes de programación -- C" . Consultado el 24 de junio de 2012 .
- ^ Clive DW Feather (12 de septiembre de 2010). "Breve descripción del Anexo Normativo 1".
- ^ "ISO/IEC 9899:1990/Amd 1:1995". Organización Internacional de Normalización. 22 de marzo de 2013.
- ^ "ISO/IEC 9899:1990/Cor 1:1994". ISO . Consultado el 21 de enero de 2019 .
- ^ "ISO/IEC 9899:1990/Cor 2:1996". ISO . Consultado el 21 de enero de 2019 .
- ^ "ISO/IEC 9899:1999". ISO . Consultado el 21 de enero de 2019 .
- ^ "INCITS/ISO/IEC 9899-2012". ANSI.
- ^ "ISO/IEC 9899:1999 - Lenguajes de programación -- C" . Consultado el 24 de junio de 2012 .
- ^ "ISO/IEC 9899:2011/Cor 1:2012". Organización Internacional de Normalización.
- ^ "ISO/IEC 9899:2018 - Tecnología de la información - Lenguajes de programación - C". www.iso.org .
- ^ "El Estándar - C". www.iso-9899.info .
- ^ "Historia de C". cppreference .
- ^ "ISO/IEC TR 19769:2004". Organización Internacional de Normalización.
- ^ "ISO/IEC TR 24731-1:2007". Organización Internacional de Normalización.
- ^ "ISO/IEC TR 18037:2008". Organización Internacional de Normalización.
- ^ "ISO/IEC TR 24732:2009". Organización Internacional de Normalización.
- ^ "ISO/IEC TR 24747:2009". Organización Internacional de Normalización.
- ^ "ISO/IEC TR 24731-2:2010". Organización Internacional de Normalización.
- ^ "ISO/IEC TS 17961:2013". Organización Internacional de Normalización.
- ^ "ISO/IEC TS 18661-1:2014". Organización Internacional de Normalización.
- ^ "ISO/IEC TS 18661-2:2015". Organización Internacional de Normalización.
- ^ "ISO/IEC TS 18661-3:2015". Organización Internacional de Normalización.
- ^ "ISO/IEC TS 18661-4:2015". Organización Internacional de Normalización.
- ^ "Características experimentales de C". cppreference.com . Consultado el 16 de enero de 2016 .
- ^ "2 estándares de lenguaje soportados por GCC - Lenguaje C 2.1". Uso de la Colección de compiladores GNU (GCC) . GCC, la Colección de compiladores GNU . Consultado el 5 de febrero de 2019 .
- ^ "Compatibilidad de lenguajes". Interfaz de usuario de la familia de lenguajes Clang para LLVM . Consultado el 5 de febrero de 2019 .
- ^ "Nombres de macros predefinidos estándar". www.ibm.com . Consultado el 10 de abril de 2019 .
- ^ "Paquete para desarrolladores HP C/ANSI C" . Consultado el 12 de julio de 2015 .
- ^ Se agregó soporte para ISO C11 a los compiladores IBM XL C/C++
- ^ Enlace a las páginas de Pelles C
Lectura adicional
- Schreiner, Axel-Tobias (1993). Programación Orientada a Objetos con ANSI-C . Hanser. ISBN 3-446-17426-5.
Enlaces externos
- Grupo de trabajo ISO C
- Proyecto de norma ANSI C (ANSI X3J11/88-090) (13 de mayo de 1988), tercera revisión pública
- Proyecto de fundamentos de la norma ANSI C (ANSI X3J11/88-151) (18 de noviembre de 1988)
- Boletín informativo C n.º 1 (ANSI X3J11/93-007) (27 de mayo de 1992)
- Gramática ANSI C Yacc
- Gramática ANSI C, especificación Lex
- "ISO/IEC 9899:1999 Lenguajes de programación – C". Instituto Nacional Estadounidense de Normas. Archivado desde el original el 25 de julio de 2011. Consultado el 6 de agosto de 2009 .
- "ANSI Standards Action Vol. 36, #48" (PDF) . Instituto Nacional Estadounidense de Normas. 2 de diciembre de 2005. Archivado desde el original (PDF) el 4 de marzo de 2016. Consultado el 6 de agosto de 2009 .