Esta es la información que falta sobre _Pragma (), FP_CONTRACT, CX_LIMITED_RANGE. Noviembre de 2020 ) ( |
Revisiones del lenguaje C |
---|
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] Extiende 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 de lenguaje de programación C, publicada en 2011, reemplaza a C99.
Historia [ editar ]
Después de que ANSI produjo 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 parte durante su propio esfuerzo de estandarización. La Enmienda Normativa 1 creó un nuevo estándar para C en 1995, pero solo para corregir algunos detalles del estándar de 1989 y para agregar un soporte más extenso para juegos de caracteres internacionales. El estándar se sometió a una nueva revisión a fines de la década de 1990, lo que llevó a la publicación de ISO / IEC 9899: 1999 en 1999, que fue adoptado como estándar ANSI en mayo de 2000. El lenguaje definido por esa versión del estándar 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 [ editar ]
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 int
asume implícitamente. El comité de estándares de C decidió que era más valioso para los compiladores diagnosticar la omisión inadvertida del especificador de tipo que procesar silenciosamente el código heredado que se basaba en implícito int
. En la práctica, es probable que los compiladores muestren una advertencia, luego asuman int
y 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]
- funciones en línea
- declaraciones y código entremezclados: la declaración de variable ya no está restringida al alcance del archivo o al inicio de una declaración compuesta (bloque), lo que facilita la forma de asignación única estática
- varios tipos de datos nuevos , incluidos
long long int
tipos de enteros extendidos opcionales, un tipo de datos booleano explícito y uncomplex
tipo para representar números complejos - matrices de longitud variable (aunque posteriormente relegadas en C11 a una característica condicional que las implementaciones no están obligadas a admitir)
- miembros de matriz flexible
- soporte para comentarios de una línea que comiencen con
//
, como en BCPL , C ++ y Java - nuevas funciones de biblioteca, como
snprintf
- nuevas cabeceras , tales como , , , y
<stdbool.h>
<complex.h>
<tgmath.h>
<inttypes.h>
- matemáticas (macro) funciones de tipo genérico, en
<tgmath.h>
, que seleccionan una biblioteca matemática función en base afloat
,double
olong double
argumentos, etc. - soporte mejorado para punto flotante IEEE
- inicializadores designados (por ejemplo, la inicialización de una estructura por nombres de campo:
struct point p = { .x = 1, .y = 2 };
) [5] - Los literales de compuestos (por ejemplo, es posible construir en estructuras llamadas de función:
function((struct x) {1, 2})
) [6] - soporte para macros variadic (macros con un número variable de argumentos)
restrict
La calificación permite una optimización de código más agresiva , eliminando las ventajas de acceso a la matriz en tiempo de compilación que anteriormente tenía FORTRAN sobre ANSI C [7]- Nombres de caracteres universales, que permiten que las variables de usuario contengan otros caracteres además del conjunto de caracteres estándar.
- palabra clave
static
en índices de matriz en declaraciones de parámetros [8]
Partes del estándar C99 se incluyen 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 [ editar ]
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 coma flotante "). Las plataformas sin hardware IEEE 754 también pueden implementarlo en software. [2]
En plataformas con punto flotante IEEE 754:
float
se define como precisión simple IEEE 754 ,double
se define como precisión doble ylong double
se define como precisión extendida IEEE 754 (por ejemplo, precisión extendida doble Intel de 80 bits en plataformas x86 o x86-64 ), o alguna forma de precisión cuádruple cuando esté disponible; de lo contrario, es de doble precisión.- Las cuatro operaciones aritméticas y la raíz cuadrada se redondean correctamente según lo definido por IEEE 754.
FLT_EVAL_METHOD flotador doble doble largo 0 flotador doble doble largo 1 doble doble doble largo 2 doble largo doble largo doble largo - La evaluación de expresiones se define para realizarse en uno de tres métodos bien definidos, lo que indica si las variables de punto flotante se promueven primero a un formato más preciso en las expresiones:
FLT_EVAL_METHOD == 2
indica que todos los cálculos intermedios internos se realizan de forma predeterminada con alta precisión (doble largo) cuando está disponible (por ejemplo, 80 bits doble extendido ),FLT_EVAL_METHOD == 1
realiza todas las expresiones intermedias internas con precisión doble (a menos que un operando sea doble largo), mientras queFLT_EVAL_METHOD == 0
especifica que cada operación se evalúa solo con la precisión del operando más ancho de cada operador. El tipo de resultado intermedio para operandos de una precisión determinada se resume en la tabla adyacente.
FLT_EVAL_METHOD == 2
tiende a limitar el riesgo de errores de redondeo que afecten a expresiones numéricamente inestables (consulte el fundamento del diseño IEEE 754 ) y es el método predeterminado diseñado para el hardware x87 , pero produce un comportamiento poco intuitivo para el usuario desprevenido; [9] FLT_EVAL_METHOD == 1
fue el método de evaluación predeterminado utilizado originalmente en K&R C , que promovió que todos los flotantes se duplicaran en las expresiones; y FLT_EVAL_METHOD == 0
también se usa comúnmente y especifica un estricto "evaluar al tipo" de los operandos. (Para gcc , FLT_EVAL_METHOD == 2
es el predeterminado en x86 de 32 bits y FLT_EVAL_METHOD == 0
es el predeterminado en x86-64 de 64 bits, peroFLT_EVAL_METHOD == 2
se 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 usaba hardware de coma flotante x87 , lo que generaba un comportamiento específico del compilador; [10] tales incoherencias no están permitidas en compiladores conformes a C99 (anexo F).
Ejemplo [ editar ]
El siguiente código C99 de ejemplo anotado para calcular una función de fracción continua demuestra las características principales:
#include <stdio.h>#include <math.h>#include <float.h>#include <fenv.h>#include <tgmath.h>#include <stdbool.h>#include <assert.h>double compute_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 infinito" ); 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 ) put ( "Desbordamiento no anticipado." ); return r ;}int main ( vacío ){ #ifndef __STDC_IEC_559__ puts ( "Advertencia: __STDC_IEC_559__ no definida IEEE 754 de punto flotante no totalmente compatible." ); // [9] #terminara si #pragma STDC FENV_ACCESS ON #ifdef TEST_NUMERIC_STABILITY_UP fesetround ( FE_UPWARD ); // [10] #elif TEST_NUMERIC_STABILITY_DOWN fesetround ( FE_DOWNWARD ); #terminara si printf ( "% .7g \ n " , compute_fn ( 3.0 )); printf ( "% .7g \ n " , compute_fn ( NAN )); return 0 ;}
Notas a pie de página:
- Compilar con:
gcc -std=c99 -mfpmath=387 -o test_c99_fp -lm test_c99_fp.c
- Como los indicadores de estado IEEE 754 se manipulan en esta función, este #pragma es necesario para evitar que el compilador reorganice incorrectamente tales pruebas al optimizar. (Los pragmas suelen estar definidos por la implementación, pero los que tienen el prefijo
STDC
se definen en el estándar C.) - C99 define un número limitado de métodos de evaluación de expresiones: el modo de compilación actual se puede verificar para asegurarse de que cumpla con los supuestos bajo los cuales se escribió el código.
- Los valores especiales como NaN e infinito positivo o negativo se pueden probar y configurar.
long double
se define como IEEE 754 de precisión doble extendida o cuádruple si está disponible. El uso de una precisión superior a la requerida para los cálculos intermedios puede minimizar el error de redondeo [11] (el typedefdouble_t
se puede utilizar para el código portátil en todos losFLT_EVAL_METHOD
s).- La función principal a evaluar. Aunque parece que algunos argumentos a esta fracción continua, por ejemplo, 3.0, llevarí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 correctamente conducir a un resultado finito: IEEE 754 está definido para no atrapar tales excepciones de forma predeterminada y está diseñado para que se puedan ignorar muy a menudo, como en este caso. (Si
FLT_EVAL_METHOD
se define como 2, entonces todos los cálculos internos, incluidas las constantes, se realizarán con precisión doble larga; siFLT_EVAL_METHOD
se define como 0, entonces se necesita un cuidado adicional para garantizar esto, incluidas posiblemente conversiones adicionales y la especificación explícita de constantes como doble largo). - Como el indicador de división por cero elevado no es un error en este caso, simplemente se puede descartar para borrar el indicador y utilizarlo en un código posterior.
- 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).
__STDC_IEC_559__
sólo debe definirse si el compilador y la biblioteca C implementan completamente el "Anexo F IEC 60559 aritmética de punto flotante" (los usuarios deben tener en cuenta que esta macro a veces se define cuando no debería).- El modo de redondeo predeterminado es el redondeo al más cercano (con la regla de redondeo par en los casos intermedios) para IEEE 754, pero establecer explícitamente el modo de redondeo hacia + y - infinito (definiendo
TEST_NUMERIC_STABILITY_UP
etc. en este ejemplo, al depurar) se puede utilizar para diagnosticar inestabilidad numérica. [12] Este método se puede utilizar incluso sicompute_fn()
forma parte de una biblioteca binaria compilada por separado. Pero dependiendo de la función, no siempre se pueden detectar inestabilidades numéricas.
Detección de versión [ editar ]
Una macro estándar __STDC_VERSION__
se define con un valor 199901L
para 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 asegura que inline
está disponible en cualquier caso (reemplazándolo con static
en C90 para evitar errores del enlazador).
#if __STDC_VERSION__> = 199901L / * "inline" es una palabra clave * / #else # define inline static #endif
Implementaciones [ editar ]
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 en su lugar principalmente en respaldar los desarrollos de los estándares C ++. [13] Sin embargo, con la introducción de Visual C ++ 2013, Microsoft implementó un subconjunto limitado de C99, que se expandió en Visual C ++ 2015. [14]
Compilador | Nivel de apoyo | Detalles de compatibilidad C99 |
---|---|---|
Bellota C / C ++ | Parcial | La documentación oficial indica que se admiten "la mayoría" de las funciones del compilador, junto con "algunas" de las funciones de la biblioteca. |
Conjunto de compiladores AMD x86 Open64 | Principalmente | Tiene soporte C99 igual al de GCC. [15] |
cc65 | Parcial | No se implementa el soporte completo de C89 y C99, en parte debido a limitaciones de la plataforma ( MOS Technology 6502 ). No hay soporte planeado para algunos tipos C99 como _Complex y enteros de 64 bits (long long). [dieciséis] |
Ch | Parcial | Admite las principales funciones de C99. [17] |
Sonido metálico | Principalmente | Admite todas las funciones excepto los pragmas de punto flotante C99. [18] |
CompCert | Principalmente | Un compilador certificado, formalmente probado correcto. Admite todas las funciones, excepto los números complejos C99 y VLA, y restricciones menores en las declaraciones de cambio (no el dispositivo de Duff ). [19] |
cparser | Completo | Admite las funciones de C99. [20] |
Constructor de C ++ | Solo en modo de 64 bits, ya que el último es CLang fork [ cita requerida ] | |
Compilador Digital Mars C / C ++ | Parcial | Carece de soporte para algunas funciones, como < tgmath.h > y _Pragma. [21] |
GCC | Principalmente | En junio de 2014 [actualizar], los identificadores extendidos, los pragmas estándar y el soporte de punto flotante IEEE 754 / IEC 60559 faltaban en la línea principal de GCC. Además, algunas características (como tipos de enteros extendidos y nuevas funciones de biblioteca) deben ser proporcionadas por la biblioteca estándar de C y están fuera del alcance de GCC. [22] Las versiones 4.6 y 4.7 de GCC también proporcionan el mismo nivel de cumplimiento. [23] [24] Compatibilidad parcial con IEEE 754, incluso cuando el hardware es compatible: algunas opciones del compilador pueden ser necesarias para evitar optimizaciones incorrectas (p. Ej., -Std = c99 y -fsignaling-nans ), pero la compatibilidad total con los modos de redondeo dirigido es faltan incluso cuando se usa -frounding-math . [25] |
Software de Green Hills | Completo | |
IBM C para AIX, V6 [26] y XL C / C ++ V11.1 para AIX [27] | Completo | |
Logiscopio de IBM Rational | Completo | Hasta Logiscope 6.3, solo se admitían las construcciones básicas de C99. C99 es oficialmente compatible con Logiscope 6.4 y versiones posteriores. [28] |
The Portland Group PGI C / C ++ | Completo | |
Banco de trabajo integrado de IAR Systems | Principalmente | No es compatible con UCN (nombres de caracteres universales). Compilador para objetivos integrados, como ARM, Coldfire, MSP430, AVR, AVR32, 8051, ... Sin objetivos x86. |
Compilador Intel C ++ | Principalmente [ cita requerida ] | |
Microsoft Visual C ++ | Parcial [14] | Visual C ++ 2012 y versiones anteriores no admitían C99. [29] [30] [31] Visual C ++ 2013 implementa un subconjunto limitado de C99 requerido para compilar proyectos populares de código abierto. [32] [33] Visual C ++ 2015 implementa la biblioteca estándar C99, con la excepción de las características de la biblioteca que dependen de las características del compilador que aún no son compatibles con el compilador (por ejemplo, < tgmath.h > no está implementado). [14] Visual C ++ 2019 (16.6) agrega soporte opt-in para un preprocesador conforme a C99. [34] |
Abrir Watcom | Parcial | Implementa las partes del estándar más utilizadas. Sin embargo, solo se habilitan a través del modificador de línea de comandos no documentado "-za99". Se han empaquetado tres características de C99 como extensiones de C90 desde pre-v1.0: comentarios de estilo C ++ (//), miembros de matriz flexible, coma final permitida en la declaración de enumeración. [35] |
Pelles C | Completo | Admite todas las funciones de C99. [36] |
Compilador de C portátil | Parcial | Trabajando para cumplir con C99. [ cita requerida ] |
Estudio Sun | Completo [37] | |
El kit del compilador de Amsterdam | No [ cita requerida ] | Actualmente se está investigando una interfaz C99. [ cita requerida ] |
Pequeño compilador de C | Parcial | No admite números complejos. [38] [39] Se admiten matrices de longitud variable, pero no como argumentos en funciones [ cita requerida ] . Los desarrolladores afirman que "TCC se dirige hacia el cumplimiento total de ISOC99". [40] |
vbcc | Parcial |
Trabajo futuro [ editar ]
Desde la ratificación del estándar C de 1999, el grupo de trabajo de estándares preparó informes técnicos que especificaban soporte mejorado para procesamiento integrado, tipos de datos de caracteres adicionales ( soporte Unicode ) y funciones de biblioteca con verificación de límites mejorada . El trabajo continúa en informes técnicos que abordan el punto flotante decimal , funciones especiales matemáticas adicionales y funciones adicionales de asignación de memoria dinámica . Los comités de estándares C y C ++ han estado colaborando en las especificaciones para la programación con subprocesos .
La próxima revisión de la norma C, C11 , fue ratificada en 2011. [41] El comité de normas C adoptó directrices que limitaban la adopción de nuevas características que no han sido probadas por implementaciones existentes. Se hizo un gran esfuerzo para desarrollar un modelo de memoria , con el fin de aclarar los puntos de secuencia y para admitir la programación con hilos .
Ver también [ editar ]
- C ++ 17 , C ++ 14 , C ++ 11 , C ++ 03 , C ++ 98 , versiones del estándar del lenguaje de programación C ++
- Compatibilidad de C y C ++
- Informe técnico de C ++ 1
- Punto flotante , para una mayor discusión sobre el uso del hardware IEEE 754
Referencias [ editar ]
- ^ "ISO / IEC 9899: 1999 - lenguajes de programación - C" . Iso.org. 8 de diciembre de 2011 . Consultado el 8 de abril de 2014 .
- ^ a b http://grouper.ieee.org/groups/754/meeting-materials/2001-07-18-c99.pdf
- ^ "Estándares: uso de la colección de compiladores GNU (GCC)" . Gcc.gnu.org . Consultado el 8 de abril de 2014 .
- ^ "Opciones de dialecto C - Uso de la colección del compilador GNU (GCC)" . Gcc.gnu.org. 6 de mayo de 2009 . Consultado el 8 de abril de 2014 .
- ^ "Uso de la colección de compiladores GNU (GCC): inicializadores designados" . gnu.org . Consultado el 18 de septiembre de 2019 .
- ^ "Uso de la colección de compiladores GNU (GCC): literales compuestos" . gnu.org . Consultado el 31 de enero de 2016 .
- ^ Ulrich Drepper (23 de octubre de 2007). "Lo que todo programador debe saber sobre la memoria" . LWN.net . Consultado el 3 de abril de 2015 .
- ^ Especificación ISO / IEC 9899: 1999, TC3 (PDF) . pag. 119, § 6.7.5.3 Declaradores de funciones (incluidos prototipos) párr. 7.
- ^ Doug Priest (1997). "Diferencias entre implementaciones de IEEE 754" .
- ^ Jack Woehr (1 de noviembre de 1997). "Una conversación con William Kahan" .
- ^ William Kahan (11 de junio de 1996). "El efecto nefasto de los puntos de referencia informáticos sobre las matemáticas aplicadas, la física y la química" (PDF) .
- ^ William Kahan (11 de enero de 2006). "¿Cuán inútiles son las evaluaciones inconscientes del redondeo en la computación de punto flotante?" (PDF) .
- ^ Peter Bright (29 de junio de 2013). "C99 reconocido por fin mientras Microsoft establece su camino hacia C ++ 14" . Ars Technica . Consultado el 9 de enero de 2015 .
- ^ a b c Brenner, Pat. "Novedades de Visual C ++ en Visual Studio 2015" . Red de desarrolladores de Microsoft . Consultado el 27 de abril de 2015 .
- ^ "x86 Open64" . Developer.amd.com. 1 de abril de 1989. Archivado desde el original el 3 de mayo de 2009 . Consultado el 8 de junio de 2009 .
- ^ "cc65 - un compilador de C freeware para sistemas basados en 6502" . Consultado el 14 de septiembre de 2011 .
- ^ "Características del intérprete de C / C ++ Ch C99" . SoftIntegration, Inc. 15 de febrero de 2008 . Consultado el 15 de febrero de 2008 .
- ^ "Manual del usuario del compilador de Clang" . Consultado el 14 de octubre de 2017 .
- ^ "Manual de usuario y documentación de CompCert C v2.5" . Consultado el 12 de septiembre de 2015 .
- ^ "página de inicio de libfirm" . Consultado el 4 de febrero de 2014 .
- ^ "Implementación del lenguaje C - Digital Mars" . Consultado el 14 de septiembre de 2011 .
- ^ "Estado de las funciones de C99 en GCC" . Free Software Foundation, Inc. 12 de junio de 2014 . Consultado el 25 de agosto de 2014 .
- ^ "Estado de las características de C99 en GCC 4.6" . Free Software Foundation, Inc. 23 de mayo de 2013 . Consultado el 23 de mayo de 2013 .
- ^ "Estado de las características de C99 en GCC 4.7" . Free Software Foundation, Inc. 23 de mayo de 2013 . Consultado el 23 de mayo de 2013 .
- ^ "Semántica de matemáticas de punto flotante en GCC" . 20 de julio de 2018 . Consultado el 12 de agosto de 2018 .
- ^ "IBM C para AIX, V6.0 ahora es compatible con el estándar C99" . Consultado el 31 de enero de 2016 .
- ^ "IBM - XL C / C ++ para AIX" . Consultado el 31 de enero de 2016 .
- ^ "Soporte de IBM Rational Logiscope para el estándar C99 - Estados Unidos" . Consultado el 31 de enero de 2016 .
- ^ "Preguntas y respuestas del lector: ¿Qué pasa con VC ++ y C99?" . Molino de Sutter . Consultado el 31 de enero de 2016 .
- ^ "A.27 Uso de matrices de longitud variable C99" . Microsoft . Consultado el 31 de enero de 2016 .
- ^ "Desarrolladores de Microsoft a C99: Utilice ISO C ++" . InfoQ . Consultado el 31 de enero de 2016 .
- ^ "Soporte de biblioteca C99 en Visual Studio 2013" . Microsoft . Consultado el 31 de enero de 2016 .
- ^ "Funciones de C ++ 11/14 STL, correcciones y cambios importantes en VS 2013 - Blog del equipo de Visual C ++ - Página principal del sitio - Blogs de MSDN" . Blogs.msdn.com. 28 de junio de 2013 . Consultado el 8 de abril de 2014 .
- ^ "Anuncio de soporte completo para un preprocesador conforme a C / C ++ en MSVC" . Microsoft. 27 de marzo de 2020 . Consultado el 17 de septiembre de 2020 .
- ^ "Cumplimiento de C99 en Open Watcom" . Archivado desde el original el 3 de mayo de 2015 . Consultado el 25 de septiembre de 2015 .
- ^ "Descripción general de Pelles C" . Enero 2013.
- ^ "Léame de Sun Studio 12: C Compiler 5.9" . Sun Microsystems, Inc. 31 de mayo de 2007 . Consultado el 23 de septiembre de 2012 .
- ^ "Documentación de referencia del compilador de Tiny C" . Consultado el 31 de enero de 2016 .
- ^ De acuerdo con la lista TODO del proyecto,los tipos complejos son la única característica C99 que falta. Se han agregado matrices de longitud variable en TCC 0.9.26 [1]
- ^ "TCC: compilador de C minúsculo" . Consultado el 31 de enero de 2016 .
- ^ "Estándares: uso de la colección de compiladores GNU (GCC)" . Gcc.gnu.org . Consultado el 8 de abril de 2014 .
Lectura adicional [ editar ]
- Cheng, Harry (1 de marzo de 2002). "C99 & Computación numérica" . Diario del Dr. Dobb .
- Seebach, Peter (24 de marzo de 2004). "Desarrollo de código abierto usando C99" . developerWorks . IBM .
- "Versión final del estándar C99 con correcciones TC1, TC2 y TC3 incluidas, formateado como borrador" (PDF) . (3,61 MB)
- Justificación de la norma internacional — Lenguajes de programación — C Revisión 5.10 , abril de 2003, Justificación de C99
Enlaces externos [ editar ]
- Cosas nuevas en C9X
- Características de C99
Precedido por C89 / C90 / "ANSI C" | Estándares del lenguaje C | Sucedido por C11 |