# ANSI C

ANSI C es un estándar publicado por el Instituto Nacional Estadounidense de Estándares (ANSI), para el lenguaje de programación C. Se recomienda a los desarrolladores de software en C que cumplan con los requisitos descritos en el documento para facilitar así la portabilidad del código fuente.

## Historia de ANSI C e ISO C

El primer estándar que se publicó para C fue el de ANSI, si bien este estándar fue adoptado posteriormente por la International Organization for Standardization (ISO) y revisiones posteriores publicadas por ISO han sido adoptadas por ANSI. El término ANSI C es de uso más frecuente en la industria que ISO C. Un término más neutral es estándar C.

### C89

En 1983, el American National Standards Institute creó un comité, el X3J11, para establecer una especificación estándar para C. Tras un largo y arduo proceso, el estándar se terminó en 1989 y se ratificó como ANSI X3.159-1989 "Programming Language C." A esta versión del estándar se le conoce como "ANSI C", o también "C".

### C90

En 1990, el estándar ANSI C (con algunas modificaciones menores) fue adoptado por la International Organization for Standardization bajo la denominación ISO/IEC 9899:1990. A esta versión se le conoce como C90, si bien "C89" y "C90" son, a efectos prácticos, el mismo lenguaje de programación.

### C99

En marzo de 2000, ANSI adoptó el estándar ISO/IEC 9899:1999. A este estándar se le conoce como C99.

### C23

C23 es el estándar de C más reciente

## Compatibilidad con algunos compiladores importantes

ANSI C es compatible por casi todos los compiladores, dado que la gran parte del código escrito en C está basado en ANSI C. Se da por hecho que cualquier programa escrito sólo según el estándar C sin dependencia alguna del hardware se compila de forma correcta en cualquier plataforma con una implementación conforme con C. Si no se toman estas medidas, la mayoría de programas sólo podrán compilarse en una plataforma determinada o con un compilador en particular. Por ejemplo, por utilizar bibliotecas no estándar, tales como bibliotecas GUI, o por confiar en atributos específicos del compilador o de una plataforma, tales como el tamaño exacto de determinados tipos de datos y endianness de bytes.

### Como detectar la compatibilidad

Para minimizar las diferencias entre C K&R y el estándar ANSI C, puede utilizarse __STDC__, el macro ("estándar c") para dividir el código entre secciones ANSI y K&R.
Es preferible utilizar "#if __STDC__" como en el ejemplo superior en lugar de "#ifdef __STDC__" porque algunas implementaciones pueden otorgar a __STDC__ el valor cero para indicar que no son compatibles con ANSI. "#if" se encargará de sustituir por cero (0) todos aquellos identificadores que no pudieron ser sustituidos por un macro. De esta forma incluso si el macro __STDC__ no está definido "#if" funcionará.
En el ejemplo de arriba se ha utilizado un prototipo en la declaración de una función para implementaciones compatibles con ANSI, mientras que una declaración obsoleta -que no es ningún prototipo- se usa de forma diferente. Aunque son compatibles con C99 y C90, no se recomienda su uso.

## Compiladores compatibles con ANSI C

* GCC
* Microsoft Visual C++ (C90. Algunas características de C99) (MSVC no es compatible con C99)
* ARM RealView