ANSI 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 alienta a los desarrolladores de software que escriben en C a cumplir con los estándares, ya que hacerlo ayuda a la portabilidad entre compiladores.
Historia y perspectiva
ANSI publicó el primer estándar para C. Aunque este documento fue adoptado posteriormente 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. Mientras que algunos desarrolladores de software usan el término ISO C, otros son neutrales en cuanto al cuerpo de estándares y usan el Estándar C.
Estandarización de C
En 1983, el American National Standards Institute 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 Borrador 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.
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, la etiqueta "C89" se usa para distinguirlo de C90 pero usando el mismo método de etiquetado.
C90
ISO/IEC ratificó el mismo estándar que C89 como ISO/IEC 9899:1990, con solo cambios de formato, que a veces se denomina C90. Por lo tanto, los términos "C89" y "C90" se refieren esencialmente al mismo lenguaje.
Este estándar ha sido retirado tanto por ANSI/INCITS como por ISO/IEC.
C95
En 1995, ISO/IEC publicó una extensión, llamada Enmienda 1, para el estándar ANSI-C. Su nombre completo finalmente fue ISO/IEC 9899:1990/AMD1:1995 o apodado C95. Además de la corrección de errores, hubo cambios adicionales en las capacidades del idioma, como:
- Mejorado multibyte y amplio carácter soporte en la biblioteca estándar, introduciendo
y
así como I/O multibyte - Adición de digraphs al idioma
- Especificación de macros estándar para la especificación alternativa de los operadores, por ejemplo.
and
para&&
- Especificación de la macro estándar
__STDC_VERSION__
Además de la enmienda, ISO publicó dos correcciones técnicas para C90:
- ISO/IEC 9899:1990/Cor 1:1994 TCOR1 en 1994
- ISO/IEC 9899:1990/Cor 2:1996 en 1996
Prueba de preprocesador para compatibilidad con C95
#if defined(_STDC_VERSION___) "/* C95 código fuente compatible. */#elif defined(__STDC__)/* C89 código fuente compatible. */#endif
C99
En marzo de 2000, ANSI adoptó la norma ISO/IEC 9899:1999. Este estándar se conoce comúnmente como C99. Algunas adiciones notables al estándar anterior incluyen:
- Nuevos tipos de datos incorporados:
long long
,_Bool
,_Complex
, y_Imaginary
- Varias nuevas características de lenguaje básico, incluyendo índices de matriz estática, inicializadores designados, literales compuestos, arrays de longitud variable, miembros de matriz flexible, macros variadicas, y
restrict
palabra clave - Varios nuevos encabezados de biblioteca, incluyendo
stdint.h
,
,fenv.h
, - Compatibilidad mejorada con varias funciones C++, incluyendo funciones en línea, comentarios de línea única con
//
, mezclando declaraciones y código, y nombres de caracteres universales en identificadores - Eliminado varias características peligrosas del lenguaje C89 como declaraciones de funciones implícitas e implícitas
int
ISO publicó tres correcciones técnicas 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), notable por la deprecación de la función de biblioteca estándar
Este estándar ha sido retirado tanto por ANSI/INCITS como por ISO/IEC a favor de C11.
C11
C11 se ratificó oficialmente y se publicó el 8 de diciembre de 2011. Las características notables incluyen compatibilidad mejorada con Unicode, expresiones genéricas de tipos que utilizan la nueva palabra clave _Generic
, una API multiplataforma 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
C17
A octubre de 2018, "C17" es el estándar actual para el lenguaje de programación C.
C17 soluciona los defectos de C11 sin introducir nuevas funciones de lenguaje.
C2x
C2x es un nombre informal para la próxima (después de C17) revisión principal del estándar del lenguaje C.
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, sobre extensiones de biblioteca para apoyar formatos de transformación Unicode, integrados en C11
- ISO/IEC TR 24731-1:2007, sobre extensiones de biblioteca para soportar interfaces de control de límites, integradas en C11
- ISO/IEC TR 18037:2008, en extensiones C incrustadas
- ISO/IEC TR 24732:2009, en punto flotante decimal aritmética, superada por ISO/IEC TS 18661-2:2015
- ISO/IEC TR 24747:2009, sobre funciones matemáticas especiales,
- ISO/IEC TR 24731-2:2010, sobre extensiones de biblioteca para apoyar funciones de asignación dinámica
- ISO/IEC TS 17961:2013, sobre codificación segura en C
- ISO/IEC TS 18661-1:2014, en IEC 60559:2011-compatible binario flotante-punto aritmético
- ISO/IEC TS 18661-2:2015, en IEC 60559:2011-compatible punto flotante decimal aritmético
- ISO/IEC TS 18661-3:2015, on IEC 60559:2011-compatible interchange and extended flotaing-point types
- ISO/IEC TS 18661-4:2015, en IEC 60559:2011-compatibles funciones suplementarias
Hay más especificaciones técnicas en desarrollo y pendientes de aprobación, incluida la quinta y última parte de TS 18661, una especificación de memoria transaccional de software y extensiones de bibliotecas paralelas.
Apoyo de los principales compiladores
ANSI C ahora es compatible con casi todos los compiladores más utilizados. GCC y Clang son dos importantes compiladores de C populares en la actualidad, ambos se basan en el C11 con actualizaciones que incluyen cambios de especificaciones posteriores, como C17 y C18. Cualquier código fuente escrito solo en C estándar y sin suposiciones dependientes del hardware está virtualmente garantizado para compilar correctamente en cualquier plataforma con una implementación de C conforme. Sin tales precauciones, la mayoría de los programas pueden compilarse solo en una determinada plataforma o con un compilador en 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 byte endianness.
Detectabilidad de cumplimiento
Para mitigar las diferencias entre K&R C y el estándar ANSI C, se puede usar la macro __STDC__
("standard c") para dividir el código en ANSI y K&R. secciones.
#if defined(_STDC__) " externa int getopt()int, char * const *, const char *); #else externa int getopt(); #endif
En el ejemplo anterior, se usa un prototipo en una declaración de función para implementaciones compatibles con ANSI, mientras que, de lo contrario, se usa una declaración obsoleta que no es un prototipo. Esos siguen siendo compatibles con ANSI a partir de C99. Tenga en cuenta cómo este código verifica tanto la definición como la evaluación: esto se debe a que algunas implementaciones pueden establecer __STDC__
en cero para indicar que no cumple con ANSI.
Compiladores compatibles con ANSI C
- Amsterdam Compiler Kit (C K implicaR y C89/90)
- ARM RealView
- Clang, usando el backend LLVM
- GCC (full C89/90, C99 and C11)
- Compilador HP C/ANSI C (C89 y C99)
- IBM XL C/C++ (C11, empezando por la versión 12.1)
- Intel ICC
- LabWindows/CVI
- LCC
- OpenWatcom (C89/90 y algunos C99)
- Microsoft Visual C++ (C89/90 y algunos C99)
- Pelles C (C99 y C11. Solo Windows.)
- vbcc (C89/90 y C99)
- Tiny C Compiler (C89/90 y algunos C99)
- Oracle Developer Studio
Contenido relacionado
Charles Babbage
Plan 9 de Bell Labs
I386