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) y el grupo de trabajo 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 recomienda a los desarrolladores de software que escriben en C que se ajusten a estos estándares, ya que esto facilita la portabilidad entre compiladores.
Historia y perspectivas
El primer estándar para C fue publicado por ANSI. Si bien 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 usa para referirse al estándar. [ 1 ] Mientras que algunos desarrolladores de software usan el término ISO C, otros son neutrales en cuanto a organismos de normalización y usan el estándar C.
Especificación informal: K&R C ( C78 )
Especificación informal en 1978 ( libro de Brian Kernighan y Dennis Ritchie, The C Programming Language ).
Estandarización C
En 1983, el Instituto Nacional Estadounidense de Estándares (ANSI) 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 se 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 se conoce comúnmente como "ANSI C". Posteriormente, en ocasiones se utilizó la denominación "C89" para distinguirla de C90, aunque con el mismo método de nomenclatura.
C90
La misma norma que C89 fue ratificada por ISO/IEC como ISO/IEC 9899:1990, con solo cambios de formato, [ 3 ] que a veces se denomina 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 ]
C94/C95
En 1995, la ISO / IEC publicó una extensión, denominada Enmienda 1, para el estándar C. Su nombre completo fue finalmente ISO/IEC 9899:1990/AMD1:1995 , conocida como C94 o C95 . Además de la corrección de errores, hubo otros cambios en las capacidades del lenguaje, [ 6 ] [ 7 ] tales como:
- Soporte mejorado para caracteres multibyte y anchos en la biblioteca estándar, introduciendo
<wchar.h>E<wctype.h>/ S multibyte - Adición de dígrafos al idioma
- Especificación de macros estándar para la especificación alternativa de operadores , por ejemplo,
andpara&& - Especificación de la macro estándar
__STDC_VERSION__.
Esta fue la primera norma con un valor __STDC_VERSION__ (199409L) y la primera versión en la que el año de dicho valor no coincidía con el año de publicación (1995), lo que dio lugar a los nombres comunes C94 y C95 . Esto volvería a ocurrir en C17 (2018) y C23 (2024), pero estas se conocen más comúnmente por sus años anteriores, mientras que a esta norma se la suele denominar por su año posterior. [ 8 ]
Además de la enmienda, ISO publicó dos corrigendos técnicos para C90:
Prueba de preprocesador para compatibilidad con C95
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199409L /* Código fuente compatible con C95. */ #elif defined(__STDC__) /* Código fuente compatible con C89. */ #endifC99
En marzo de 2000, ANSI adoptó la norma ISO/IEC 9899:1999. [ 11 ] Esta norma se conoce comúnmente como C99. Algunas adiciones notables a la norma anterior incluyen:
- Nuevos tipos de datos integrados :
long long,_Bool,_Complex, y_Imaginary - Varias características nuevas del lenguaje principal, incluyendo índices de matrices estáticas, inicializadores designados , literales compuestos , matrices de longitud variable , miembros de matrices flexibles , macros variádicas y
restrictpalabras clave - Varios encabezados de biblioteca nuevos , incluyendo
stdint.h, , ,<tgmath.h>fenv.h<complex.h> - Compatibilidad mejorada con varias características de C++ , incluidas las funciones en línea , los comentarios de una sola línea con
//, la mezcla de declaraciones y código, y los nombres de caracteres universales en los identificadores. - Se eliminaron varias características peligrosas del lenguaje C89, como las declaraciones de funciones implícitas y las declaraciones implícitas.
int
La ISO publicó tres correcciones técnicas para la norma 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 la biblioteca estándar gets
Esta norma ha sido retirada tanto por ANSI/INCITS [ 12 ] como por ISO/IEC [ 13 ] en favor de C11.
C11
C11 fue ratificado y publicado oficialmente el 8 de diciembre de 2011. Entre sus características más destacadas se incluyen una mejor compatibilidad con Unicode , expresiones genéricas de tipo mediante la nueva palabra clave, una API de subprocesos múltiples_Generic multiplataforma ( ) y compatibilidad con tipos atómicos tanto en el lenguaje principal como en la biblioteca ( ).threads.hstdatomic.h
La ISO ha publicado una corrección técnica para C11:
- ISO/IEC 9899:2011/Cor 1:2012 [ 14 ]
C17
C17 se publicó en junio de 2018. [ 15 ] En lugar de introducir nuevas características del lenguaje, solo aborda defectos en C11. [ 16 ]
C23
C23 se publicó en octubre de 2024 y es el estándar actual para el lenguaje de programación C. [ 17 ]
C2Y
C2Y es el nombre informal de la próxima revisión del lenguaje de programación C, cuyo lanzamiento se espera para finales de la década de 2020.
Otras publicaciones relacionadas de la ISO
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, [ 18 ] sobre extensiones de biblioteca para admitir formatos de transformación Unicode , integrados en C11
- ISO/IEC TR 24731-1:2007, [ 19 ] sobre extensiones de biblioteca para admitir interfaces con comprobación de límites, integradas en C11
- ISO/IEC TR 18037:2008, [ 20 ] sobre extensiones C integradas
- ISO/IEC TR 24732:2009, [ 21 ] sobre aritmética de punto flotante decimal , reemplazada por ISO/IEC TS 18661-2:2015
- ISO/IEC TR 24747:2009, [ 22 ] sobre funciones matemáticas especiales,
- ISO/IEC TR 24731-2:2010, [ 23 ] sobre extensiones de biblioteca para admitir funciones de asignación dinámica
- ISO/IEC TS 17961:2013, [ 24 ] sobre codificación segura en C
- ISO/IEC TS 18661-1:2014, [ 25 ] sobre aritmética de punto flotante binario compatible con IEC 60559:2011
- ISO/IEC TS 18661-2:2015, [ 26 ] sobre aritmética de punto flotante decimal compatible con IEC 60559:2011
- ISO/IEC TS 18661-3:2015, [ 27 ] sobre tipos de punto flotante extendidos y de intercambio compatibles con IEC 60559:2011
- ISO/IEC TS 18661-4:2015, [ 28 ] sobre funciones suplementarias 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. [ 29 ]
Soporte de los principales compiladores
ANSI C es compatible con casi todos los compiladores de uso común. GCC y Clang son dos de los principales compiladores de C populares hoy en día, ambos basados en C11 con actualizaciones que incluyen cambios de especificaciones posteriores como C17. [ 30 ] [ 31 ] Cualquier código fuente escrito solo en C estándar y sin ninguna suposición dependiente del hardware tiene prácticamente garantizada su 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 plataforma determinada 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 del cumplimiento
Para mitigar las diferencias entre el estándar K&R C y el estándar ANSI C, __STDC__se puede utilizar la macro ("standard c") para dividir el código en secciones ANSI y K&R.
#if defined(__STDC__) && __STDC__ extern int getopt ( int , char * const * , const char * ); #else extern int getopt (); #endifEn el ejemplo anterior, se utiliza un prototipo en la declaración de una función para implementaciones compatibles con ANSI, mientras que en caso contrario se utiliza una declaración obsoleta sin prototipo. Estas siguen siendo compatibles con ANSI a partir de C99. Nótese cómo este código comprueba tanto la definición como la evaluación: esto se debe a que algunas implementaciones pueden establecer __STDC__un valor cero para indicar que no cumplen con ANSI. [ 32 ]
Soporte del compilador
Lista de compiladores que admiten ANSI C:
- Acornsoft ANSI C (primera versión en 1988, revisada en 1989)
- Kit de compilación de Ámsterdam (C K&R y C89/90)
- ARM RealView
- Clang (completo C89/C90 y C99, parcial C11, C17, C23 y C2y), usando el backend de LLVM.
- GCC (C89/90 completo, C99, C11, C17, C23 y algunos C2y experimentales/incompletos)
- Compilador HP C/ANSI C (C89 y C99) [ 33 ]
- IBM XL C/C++ (C11, a partir de la versión 12.1) [ 34 ]
- ICC de Intel (las versiones posteriores se basan en clang y cuentan con su soporte ).
- LabWindows/CVI
- LCC
- Oracle Developer Studio
- OpenWatcom (C89/90 y algunos C99)
- Pelles C (C99 y C11. Solo para Windows.) [ 35 ]
- vbcc (C89/90 y C99)
- Compilador C pequeño (C89/90 y algo de C99)
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 madura" . PC Magazine . Vol. 7, n.º 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). "Una 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.
- ↑ "Manual de GNU GCC 15.2" . Free Software Foundation. 2025.
- ↑ "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 .
- ↑ "ISO/IEC 9899:2024 - Tecnología de la información — Lenguajes de programación — C" .
- ↑ "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 compatibles con GCC - 2.1 Lenguaje C" . 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 lenguaje" . 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 de HP C/ANSI C" . Consultado el 12 de julio de 2015 .
- ↑ Se ha añadido compatibilidad con ISO C11 a los compiladores IBM XL C/C++.
- ↑ enlace a las páginas de Pelles C
Lecturas adicionales
- 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 la justificación 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
- Normas del Instituto Nacional Estadounidense de Estándares
- C (lenguaje de programación)
- estándares de lenguajes de programación