stringtranslate.com

C99

Portada del documento de estándares C99

C99 (anteriormente conocido como C9X ) es un nombre informal para ISO/IEC 9899:1999 , una versión anterior del estándar del lenguaje de programación C. [1] Amplía la versión anterior ( C90 ) con nuevas características para el lenguaje y la biblioteca estándar , y ayuda a las implementaciones a hacer un mejor uso del hardware informático disponible, como la aritmética de punto flotante IEEE 754-1985 y la tecnología de compilación. [2] La versión C11 del estándar del lenguaje de programación C, publicada en 2011, actualiza C99.

Historia

Después de que ANSI produjera el estándar oficial para el lenguaje de programación C en 1989, que se convirtió en un estándar internacional en 1990, la especificación del lenguaje C permaneció relativamente estática durante algún tiempo, mientras que C++ continuó evolucionando, en gran medida durante su propio esfuerzo de estandarización. La Enmienda Normativa 1 creó un nuevo estándar para C en 1995, pero sólo para corregir algunos detalles del estándar de 1989 y agregar un soporte más extenso para juegos de caracteres internacionales. La norma se sometió a nuevas revisiones a finales de la década de 1990, lo que llevó a la publicación de ISO/IEC 9899:1999 en 1999, que fue adoptada como norma ANSI en mayo de 2000. El lenguaje definido por esa versión de la norma se conoce comúnmente como " C99". El estándar internacional C es mantenido por el grupo de trabajo ISO/IEC JTC1/SC22 /WG14.

Diseño

C99 es, en su mayor parte, compatible con versiones anteriores de C89, pero es más estricto en algunos aspectos. [3]

En particular, una declaración que carece de un especificador de tipo ya no se intasume implícitamente. El comité de estándares de C decidió que era más valioso para los compiladores diagnosticar la omisión involuntaria del especificador de tipo que procesar silenciosamente código heredado que dependía de implícitos int. En la práctica, es probable que los compiladores muestren una advertencia y luego asuman inty continúen traduciendo el programa.

C99 introdujo varias características nuevas, muchas de las cuales ya se habían implementado como extensiones en varios compiladores: [4]

Partes del estándar C99 están incluidas en la versión actual del estándar C++ , incluidos tipos de enteros, encabezados y funciones de biblioteca. Las matrices de longitud variable no se encuentran entre estas partes incluidas porque la biblioteca de plantillas estándar de C++ ya incluye una funcionalidad similar.

Soporte de punto flotante IEEE 754

Una característica importante de C99 es su soporte numérico y, en particular, su soporte para acceder a las características del hardware de punto flotante IEEE 754-1985 (también conocido como IEC 60559) presente en la gran mayoría de los procesadores modernos (definido en el "Anexo F IEC 60559 aritmética de punto flotante"). Las plataformas sin hardware IEEE 754 también pueden implementarlo en software. [2]

En plataformas con punto flotante IEEE 754:

FLT_EVAL_METHOD == 2tiende a limitar el riesgo de errores de redondeo que afectan a expresiones numéricamente inestables (consulte la justificación del diseño IEEE 754 ) y es el método predeterminado diseñado para hardware x87 , pero produce un comportamiento poco intuitivo para el usuario desprevenido; [9] FLT_EVAL_METHOD == 1 era el método de evaluación predeterminado utilizado originalmente en K&R C , que promovía que todos los flotantes se duplicaran en las expresiones; y FLT_EVAL_METHOD == 0también se usa comúnmente y especifica una estricta "evaluación del tipo" de los operandos. (Para gcc , FLT_EVAL_METHOD == 2es el valor predeterminado en x86 de 32 bits y FLT_EVAL_METHOD == 0es el predeterminado en x86-64 de 64 bits, pero FLT_EVAL_METHOD == 2se puede especificar en x86-64 con la opción -mfpmath=387). Antes de C99, los compiladores podían redondear los resultados intermedios de manera inconsistente, especialmente cuando se utiliza hardware de punto flotante x87 , lo que genera un comportamiento específico del compilador; [10] tales inconsistencias no están permitidas en los compiladores conformes al C99 (anexo F).

Ejemplo

El siguiente código C99 de ejemplo anotado para calcular una función de fracción continua demuestra las características principales:

#incluir <stdio.h> #incluir <matemáticas.h> #incluir <flotador.h> #incluir <fenv.h> #incluir <tgmath.h> #incluir <stdbool.h> #incluir <afirmar.h> doble cálculo_fn ( doble z ) // [1]   { #pragma STDC FENV_ACCESS ON // [2] afirmar ( FLT_EVAL_METHOD == 2 ); // [3]    si ( isnan ( z )) // [4]   pone ( "z no es un número" ); si ( isinf ( z ))  pone ( "z es infinita" ); doble largo r = 7,0 - 3,0 / ( z - 2,0 - 1,0 / ( z - 7,0 + 10,0 / ( z - 2,0 - 2,0 / ( z - 3,0 )))); // [5, 6]                      feclearexcept ( FE_DIVBYZERO ); // [7]  bool elevado = fetestexcept ( FE_OVERFLOW ); // [8]     si ( levantado )  puts ( "Desbordamiento inesperado." ); devolver r ; }int principal ( vacío ) { #ifndef __STDC_IEC_559__ puts ( "Advertencia: __STDC_IEC_559__ no definido. El punto flotante IEEE 754 no es totalmente compatible." ); // [9]  #terminara si #pragma STDC FENV_ACCESS ACTIVADO #ifdef TEST_NUMERIC_STABILITY_UP fesetround ( FE_UPWARD ); // [10]  #elif TEST_NUMERIC_STABILITY_DOWN fesetround ( FE_DOWNWARD ); #terminara si printf ( "%.7g \n " , cálculo_fn ( 3.0 ));  printf ( "%.7g \n " , cálculo_fn ( NAN ));  devolver 0 ; }

Notas a pie de página:

  1. Compilar con:gcc -std=c99 -mfpmath=387 -o test_c99_fp test_c99_fp.c -lm
  2. Como los indicadores de estado IEEE 754 se manipulan en esta función, este #pragma es necesario para evitar que el compilador reorganice incorrectamente dichas pruebas al optimizar. (Los pragmas generalmente están definidos por la implementación, pero los que tienen el prefijo STDCestán definidos en el estándar C).
  3. C99 define un número limitado de métodos de evaluación de expresiones: se puede verificar el modo de compilación actual para garantizar que cumple con los supuestos bajo los cuales se escribió el código.
  4. Los valores especiales como NaN e infinito positivo o negativo se pueden probar y configurar.
  5. long doublese define como IEEE 754 de doble extensión o precisión cuádruple, si está disponible. El uso de una precisión mayor que la requerida para los cálculos intermedios puede minimizar el error de redondeo [11] (el typedef double_t se puede usar para código que es portátil en todos FLT_EVAL_METHODlos s).
  6. La función principal a evaluar. Aunque parece que algunos argumentos para esta fracción continua, por ejemplo, 3,0, conducirían a un error de división por cero, de hecho, la función está bien definida en 3,0 y la división por 0 simplemente devolverá un +infinito que luego devolverá correctamente conducir a un resultado finito: IEEE 754 está definido para no detectar tales excepciones de forma predeterminada y está diseñado para que muy a menudo puedan ignorarse, como en este caso. (Si FLT_EVAL_METHODse define como 2, todos los cálculos internos, incluidas las constantes, se realizarán con doble precisión larga; si FLT_EVAL_METHODse define como 0, entonces se necesita cuidado adicional para garantizar esto, incluidas posiblemente conversiones adicionales y una especificación explícita de constantes como doble larga).
  7. Como el indicador de división por cero levantado no es un error en este caso, simplemente se puede descartar para borrar el indicador para su uso en código posterior.
  8. En algunos casos, otras excepciones pueden considerarse un error, como el desbordamiento (aunque, de hecho, se puede demostrar que esto no puede ocurrir en este caso).
  9. __STDC_IEC_559__se definirá sólo si el compilador y la biblioteca C implementan completamente la "aritmética de punto flotante IEC 60559 del Anexo F" (los usuarios deben tener en cuenta que esta macro a veces se define cuando no debería).
  10. El modo de redondeo predeterminado es redondear al más cercano (con la regla de redondeo par en los casos intermedios) para IEEE 754, pero se puede configurar explícitamente el modo de redondeo hacia + y - infinito (definiendo TEST_NUMERIC_STABILITY_UPetc. en este ejemplo, durante la depuración) para diagnosticar la inestabilidad numérica. [12] Este método se puede utilizar incluso si compute_fn()forma parte de una biblioteca binaria compilada por separado. Pero dependiendo de la función, no siempre es posible detectar inestabilidades numéricas.

Detección de versión

__STDC_VERSION__Se define una macro estándar con un valor 199901Lpara indicar que la compatibilidad con C99 está disponible. Al igual que con la __STDC__macro para C90, __STDC_VERSION__se puede usar para escribir código que se compilará de manera diferente para los compiladores C90 y C99, como en este ejemplo que garantiza que inlineesté disponible en cualquier caso (reemplazándolo con staticC90 para evitar errores del vinculador).

#if __STDC_VERSION__ >= 199901L /* "inline" es una palabra clave */ #else # define inline static #endif 

Implementaciones

La mayoría de los compiladores de C brindan soporte para al menos algunas de las características introducidas en C99.

Históricamente, Microsoft ha tardado en implementar nuevas funciones de C en sus herramientas de Visual C++ , centrándose principalmente en respaldar los desarrollos en los estándares de C++. [13] Sin embargo, con la introducción de Visual C++ 2013, Microsoft implementó un subconjunto limitado de C99, que se amplió en Visual C++ 2015. [14]

Trabajo futuro

Desde la ratificación del estándar C de 1999, el grupo de trabajo de estándares preparó informes técnicos que especifican un soporte mejorado para el procesamiento integrado, tipos de datos de caracteres adicionales ( soporte Unicode ) y funciones de biblioteca con verificación de límites mejorada . Continúa el trabajo en informes técnicos que abordan el punto flotante decimal, funciones matemáticas especiales adicionales y funciones adicionales de asignación de memoria dinámica . Los comités de estándares C y C++ han estado colaborando en especificaciones para programación con subprocesos .

La siguiente revisión del estándar C, C11 , fue ratificada en 2011. [41] El comité de estándares C adoptó directrices que limitaban la adopción de nuevas características que no han sido probadas por implementaciones existentes. Se dedicó mucho esfuerzo a desarrollar un modelo de memoria para aclarar los puntos de secuencia y soportar la programación por subprocesos .

Ver también

Referencias

  1. ^ "ISO/IEC 9899:1999 - Lenguajes de programación - C". Iso.org. 8 de diciembre de 2011 . Consultado el 8 de abril de 2014 .
  2. ^ ab "Soporte IEEE 754 en C99" (PDF) . IEEE . Archivado desde el original (PDF) el 28 de octubre de 2017 . Consultado el 15 de julio de 2021 .
  3. ^ "Estándares: uso de la colección de compiladores GNU (GCC)". Gcc.gnu.org . Consultado el 8 de abril de 2014 .
  4. ^ "Opciones del dialecto C: uso de la colección de compiladores GNU (GCC)". Gcc.gnu.org. 6 de mayo de 2009 . Consultado el 8 de abril de 2014 .
  5. ^ "Uso de la colección de compiladores GNU (GCC): inicializadores designados". gnu.org . Consultado el 18 de septiembre de 2019 .
  6. ^ "Uso de la colección de compiladores GNU (GCC): literales compuestos". gnu.org . Consultado el 31 de enero de 2016 .
  7. ^ Ulrich Drepper (23 de octubre de 2007). "Lo que todo programador debería saber sobre la memoria". LWN.net . Consultado el 3 de abril de 2015 .
  8. ^ Especificación ISO/IEC 9899:1999, TC3 (PDF) . pag. 119, § 6.7.5.3 Declaradores de funciones (incluidos los prototipos) párr. 7.
  9. ^ Sacerdote Doug (1997). "Diferencias entre las implementaciones de IEEE 754".
  10. ^ Jack Woehr (1 de noviembre de 1997). "Una conversación con William Kahan".
  11. ^ William Kahan (11 de junio de 1996). "El funesto efecto de los puntos de referencia informáticos en las matemáticas, la física y la química aplicadas" (PDF) .
  12. ^ William Kahan (11 de enero de 2006). "¿Cuán inútiles son las evaluaciones sin sentido del redondeo en la computación de punto flotante?" (PDF) .
  13. ^ Peter Bright (29 de junio de 2013). "C99 finalmente reconoció que Microsoft traza su camino hacia C++ 14". Ars Técnica . Consultado el 9 de enero de 2015 .
  14. ^ abc Brenner, Pat. "Novedades de Visual C++ en Visual Studio 2015". Red de desarrolladores de Microsoft . Consultado el 27 de abril de 2015 .
  15. ^ "Uso del compilador x86 Open64 Suite" (PDF) . Desarrollador.amd.com. Archivado (PDF) desde el original el 24 de enero de 2022 . Consultado el 2 de marzo de 2022 .
  16. ^ "cc65: un compilador de C gratuito para sistemas basados ​​en 6502" . Consultado el 14 de septiembre de 2011 .
  17. ^ "Características del intérprete C / C ++ Ch C99". SoftIntegration, Inc. 15 de febrero de 2008 . Consultado el 15 de febrero de 2008 .
  18. ^ "Manual del usuario del compilador Clang" . Consultado el 14 de octubre de 2017 .
  19. ^ "La documentación del compilador verificado de CompCert C y el manual del usuario (Versión 3.10)". 19 de noviembre de 2021 . Consultado el 3 de marzo de 2022 .
  20. ^ "página de inicio de libfirm" . Consultado el 4 de febrero de 2014 .
  21. ^ "Implementación del lenguaje C: Digital Mars" . Consultado el 14 de septiembre de 2011 .
  22. ^ "Estado de las funciones de C99 en GCC". Free Software Foundation, Inc. 28 de julio de 2021 . Consultado el 13 de agosto de 2021 .
  23. ^ "Estado de las funciones de C99 en GCC 4.6". Free Software Foundation, Inc. 23 de mayo de 2013 . Consultado el 23 de mayo de 2013 .
  24. ^ "Estado de las funciones de C99 en GCC 4.7". Free Software Foundation, Inc. 23 de mayo de 2013 . Consultado el 23 de mayo de 2013 .
  25. ^ "Semántica de las matemáticas de coma flotante en GCC". 20 de julio de 2018 . Consultado el 12 de agosto de 2018 .
  26. ^ "IBM C para AIX, V6.0 ahora es compatible con el estándar C99". 2 de julio de 2002 . Consultado el 31 de enero de 2016 .
  27. ^ "IBM - XL C/C++ para AIX" . Consultado el 31 de enero de 2016 .
  28. ^ "Soporte de IBM Rational Logiscope para el estándar C99 - Estados Unidos". 24 de febrero de 2012 . Consultado el 31 de enero de 2016 .
  29. ^ "Preguntas y respuestas del lector: ¿Qué pasa con VC++ y C99?". Molino de Sutter . 3 de mayo de 2012 . Consultado el 31 de enero de 2016 .
  30. ^ "A.27 Uso de matrices de longitud variable C99". Microsoft . Consultado el 31 de enero de 2016 .
  31. ^ "Desarrolladores de Microsoft a C99: utilice ISO C++". InfoQ . Consultado el 31 de enero de 2016 .
  32. ^ "Compatibilidad con la biblioteca C99 en Visual Studio 2013". Microsoft. 19 de julio de 2013 . Consultado el 31 de enero de 2016 .
  33. ^ "Funciones, correcciones y cambios importantes de STL de C ++ 11/14 en VS 2013". Blogs.msdn.com. 28 de junio de 2013 . Consultado el 8 de abril de 2014 .
  34. ^ "Anuncio de soporte total para un preprocesador compatible con C/C++ en MSVC". Microsoft. 27 de marzo de 2020 . Consultado el 17 de septiembre de 2020 .
  35. ^ "Cumplimiento de C99 en Open Watcom". Archivado desde el original el 3 de mayo de 2015 . Consultado el 25 de septiembre de 2015 .
  36. ^ "Descripción general de Pelles C". Enero de 2013. Archivado desde el original el 13 de marzo de 2022 . Consultado el 2 de marzo de 2022 .
  37. ^ "Sun Studio 12: Léame del compilador C 5.9". Sun Microsystems, Inc. 31 de mayo de 2007 . Consultado el 23 de septiembre de 2012 .
  38. ^ "Documentación de referencia del compilador Tiny C" . Consultado el 31 de enero de 2016 .
  39. ^ Según la lista TODO del proyecto, los tipos complejos son la única característica que falta en C99. Se agregaron matrices de longitud variable en TCC 0.9.26 [1]
  40. ^ "TCC: Compilador Tiny C" . Consultado el 31 de enero de 2016 .
  41. ^ "Estándares: uso de la colección de compiladores GNU (GCC)". Gcc.gnu.org . Consultado el 8 de abril de 2014 .

Otras lecturas

enlaces externos