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 American National Standards Institute (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 mejor compatible del estándar (conocida como C89 o C90 ). Se anima a los desarrolladores de software que escriben en C a cumplir 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 adoptado posteriormente por ISO/IEC y las revisiones posteriores publicadas por ISO/IEC han sido adoptadas por ANSI, todavía se utiliza "ANSI C" para referirse a la norma. [1] Mientras que algunos desarrolladores de software utilizan el término ISO C, otros son neutrales respecto de los organismos de estándares y utilizan el Estándar C.
Especificación informal en 1978 ( libro de Brian Kernighan y Dennis Ritchie The C Programming Language ).
Estandarizando 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 estándar, a veces denominado C85 . En 1986, se publicó otro Proyecto de Norma, a veces denominado C86 . La versión preliminar del Estándar C se publicó en 1988 y, a veces, se la denomina 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 a menudo se denomina "ANSI C". Posteriormente, a veces se utiliza la etiqueta "C89" para distinguirlo del C90, pero utilizando el mismo método de etiquetado.
C90
El mismo estándar que C89 fue ratificado por ISO/IEC como ISO/IEC 9899:1990, con sólo cambios de formato, [3] que a veces se denomina C90. Por lo tanto, los términos "C89" y "C90" se refieren esencialmente al mismo lenguaje.
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, denominada Enmienda 1, para la norma C. Su nombre completo finalmente fue ISO/IEC 9899:1990/AMD1:1995 o apodado C95 . Además de la corrección de errores, hubo más cambios en las capacidades del idioma, [6] [7] tales como:
- Compatibilidad mejorada con caracteres amplios y multibyte en la biblioteca estándar, introduciendo E/ S multibyte
<wchar.h>
<wctype.h>
- Adición de dígrafos al idioma.
- 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 de preprocesador para compatibilidad con C95
#si está definido(__STDC_VERSION__) && __STDC_VERSION__ >= 199409L/* Código fuente compatible con C95. */ #elif definido(__STDC__) /* Código fuente compatible con C89. */ #terminara si
C99
En marzo de 2000, ANSI adoptó la norma ISO/IEC 9899:1999. [10] Esta norma se conoce comúnmente como C99. Algunas adiciones notables al estándar anterior incluyen:
- Nuevos tipos de datos integrados :
long long
, _Bool
, _Complex
y_Imaginary
- Varias características principales nuevas del lenguaje, incluidos índices de matrices estáticas, inicializadores designados, literales compuestos, matrices de longitud variable , miembros de matrices flexibles , macros variadas 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
ISO publicó tres corrigendos técnicos 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), destaca por desaprobar la función de biblioteca estándar .
Esta norma ha sido retirada tanto por ANSI/INCITS [11] como por ISO/IEC [12] a favor de C11.
C11
C11 fue ratificado y publicado oficialmente el 8 de diciembre de 2011. Las características notables incluyen compatibilidad mejorada con Unicode , expresiones de tipo genérico que utilizan la nueva _Generic
palabra clave, una API multiplataforma y multiproceso ( threads.h
) y compatibilidad con tipos atómicos tanto en el lenguaje principal como en la biblioteca. ( stdatomic.h
).
ISO ha publicado un corrigendum técnico para C11:
- ISO/IEC 9899:2011/Cor 1:2012 [13]
C17
En octubre de 2018 [actualizar], "C17" es el estándar actual para el lenguaje de programación C. [14]
C17 soluciona 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. [dieciséis]
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 admitir formatos de transformación Unicode, integradas en C11
- ISO/IEC TR 24731-1:2007, [18] sobre extensiones de biblioteca para admitir interfaces con verificación de límites, integradas en C11
- ISO/IEC TR 18037:2008, [19] sobre extensiones C integradas
- ISO/IEC TR 24732:2009, [20] sobre aritmética de coma 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 soportar 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] en IEC 60559:2011: aritmética binaria de coma flotante compatible
- ISO/IEC TS 18661-2:2015, [25] sobre aritmética de coma flotante decimal compatible con IEC 60559:2011
- ISO/IEC TS 18661-3:2015, [26] sobre intercambio compatible con IEC 60559:2011 y tipos de punto flotante extendidos
- ISO/IEC TS 18661-4:2015, [27] sobre funciones suplementarias compatibles con IEC 60559:2011
Se están desarrollando más especificaciones técnicas pendientes de aprobación, 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 ahora es compatible con casi todos los compiladores más utilizados. GCC y Clang son dos compiladores de C importantes y populares en la actualidad, ambos basados en el C11 con actualizaciones que incluyen cambios de especificaciones posteriores como C17. [29] [30] Se garantiza virtualmente que cualquier código fuente escrito únicamente en C estándar y sin suposiciones dependientes del hardware se compilará correctamente en cualquier plataforma con una implementación conforme a C. Sin tales precauciones, la mayoría de los programas pueden compilarse sólo en una determinada plataforma o con un compilador particular, debido, por ejemplo, al uso de bibliotecas no estándar, como las 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 tamaño de bytes .
Detectabilidad del 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 está definido (__STDC__) && __STDC__ extern int getopt ( int , char * const * , const char * ); #else extern int getopt (); #terminara si
En el ejemplo anterior, se utiliza un prototipo en una declaración de función para implementaciones compatibles con ANSI, mientras que en caso contrario se utiliza una declaración obsoleta que no es un prototipo. 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]
Soporte del compilador
Lista de compiladores que admiten ANSI C:
Ver 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". Revista PC . 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 .
- ^ Pluma de Clive DW (12 de septiembre de 2010). "Una breve descripción del Anexo Normativo 1".
- ^ "ISO/IEC 9899:1990/Enmienda 1:1995". Organización Internacional de Normalización. 2013-03-22.
- ^ "ISO/IEC 9899:1990/Cor 1:1994". YO ASI . Consultado el 21 de enero de 2019 .
- ^ "ISO/IEC 9899:1990/Cor 2:1996". YO ASI . Consultado el 21 de enero de 2019 .
- ^ "ISO/CEI 9899:1999". YO ASI . 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". cppreferencia .
- ^ "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.
- ^ "Funciones experimentales de C". cppreference.com . Consultado el 16 de enero de 2016 .
- ^ "Dos estándares de idiomas admitidos por GCC: lenguaje 2.1 C". Usando la colección de compiladores GNU (GCC) . GCC, la colección de compiladores GNU . Consultado el 5 de febrero de 2019 .
- ^ "Compatibilidad de idiomas". Interfaz de la familia de lenguajes Clang C 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
Otras lecturas
- 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
- Borrador de la norma ANSI C (ANSI X3J11/88-090) (13 de mayo de 1988), tercera revisión pública
- Borrador de fundamento de ANSI C (ANSI X3J11/88-151) (18 de noviembre de 1988)
- Boletín de información C n.º 1 (ANSI X3J11/93-007) (27 de mayo de 1992)
- Gramática ANSI C Yacc
- Gramática ANSI C, especificación Lex
- "Lenguajes de programación ISO/IEC 9899:1999 - C". Instituto Americano de Estándares Nacionales. Archivado desde el original el 25 de julio de 2011 . Consultado el 6 de agosto de 2009 .
- "Acción de estándares ANSI Vol. 36, n.º 48" (PDF) . Instituto Americano de Estándares Nacionales. 2005-12-02. Archivado desde el original (PDF) el 4 de marzo de 2016 . Consultado el 6 de agosto de 2009 .