Articulo de referencia

ANSI 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) y el grupo de t...

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:

  • ISO/IEC 9899:1990/Cor 1:1994 TCOR1 en 1994 [ 9 ]
  • ISO/IEC 9899:1990/Cor 2:1996 en 1996 [ 10 ]

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. */ #endif

C99

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:

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.

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 (); #endif

En 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:

Véase también

Referencias

  1. Brad Kelechava (14 de septiembre de 2017). "El origen de ANSI C e ISO C" . Consultado el 14 de agosto de 2018 .
  2. 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 .   
  3. "Estándares - Uso de la colección de compiladores GNU (GCC)" . Consultado el 24 de junio de 2012 .
  4. "INCITS/ISO/IEC 9899" . www.techstreet.com . Consultado el 3 de octubre de 2018 .
  5. "ISO/IEC 9899:1990 - Lenguajes de programación - C" . Consultado el 24 de junio de 2012 .
  6. Clive DW Feather (12 de septiembre de 2010). "Una breve descripción del Anexo Normativo 1" .
  7. "ISO/IEC 9899:1990/Amd 1:1995" . Organización Internacional de Normalización. 22 de marzo de 2013.
  8. "Manual de GNU GCC 15.2" . Free Software Foundation. 2025.
  9. "ISO/IEC 9899:1990/Cor 1:1994" . ISO . Consultado el 21 de enero de 2019 .
  10. "ISO/IEC 9899:1990/Cor 2:1996" . ISO . Consultado el 21 de enero de 2019 .
  11. "ISO/IEC 9899:1999" . ISO . Consultado el 21 de enero de 2019 .
  12. «INCITS/ISO/IEC 9899-2012» . ANSI.
  13. "ISO/IEC 9899:1999 - Lenguajes de programación - C" . Consultado el 24 de junio de 2012 .
  14. "ISO/IEC 9899:2011/Cor 1:2012" . Organización Internacional de Normalización.
  15. "ISO/IEC 9899:2018 - Tecnología de la información - Lenguajes de programación - C" . www.iso.org .
  16. "El estándar - C" . www.iso-9899.info .
  17. "ISO/IEC 9899:2024 - Tecnología de la información — Lenguajes de programación — C" .
  18. "ISO/IEC TR 19769:2004" . Organización Internacional de Normalización.
  19. "ISO/IEC TR 24731-1:2007" . Organización Internacional de Normalización.
  20. "ISO/IEC TR 18037:2008" . Organización Internacional de Normalización.
  21. "ISO/IEC TR 24732:2009" . Organización Internacional de Normalización.
  22. "ISO/IEC TR 24747:2009" . Organización Internacional de Normalización.
  23. "ISO/IEC TR 24731-2:2010" . Organización Internacional de Normalización.
  24. "ISO/IEC TS 17961:2013" . Organización Internacional de Normalización.
  25. "ISO/IEC TS 18661-1:2014" . Organización Internacional de Normalización.
  26. "ISO/IEC TS 18661-2:2015" . Organización Internacional de Normalización.
  27. "ISO/IEC TS 18661-3:2015" . Organización Internacional de Normalización.
  28. "ISO/IEC TS 18661-4:2015" . Organización Internacional de Normalización.
  29. "Características experimentales de C" . cppreference.com . Consultado el 16 de enero de 2016 .
  30. "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 .
  31. "Compatibilidad de lenguaje" . Interfaz de la familia de lenguajes Clang C para LLVM . Consultado el 5 de febrero de 2019 .
  32. "Nombres de macros predefinidos estándar" . www.ibm.com . Consultado el 10 de abril de 2019 .
  33. "Paquete para desarrolladores de HP C/ANSI C" . Consultado el 12 de julio de 2015 .
  34. Se ha añadido compatibilidad con ISO C11 a los compiladores IBM XL C/C++.
  35. 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.
  • 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