El estándar internacional ISO 9899, fue creado por ISO (Organización Internacional de Normalización) con el objetivo de promover la portabilidad de los programas en C en varios sistemas de procesamiento de datos. Está direccionado a la utilización de los ejecutores y los programadores.

Alcance Este estándar determina la forma en la cual se interpreta los programas en el lenguaje de programación C en los siguientes apartados:

La representación de programas escritos en C.

La sintaxis y restricciones de C.

Las reglas semánticas para interpretar programas en C.

La representación de los datos de salida resultantes de programas de C.

Las restricciones y limitaciones impuestas de acuerdo a la implementación de C.

Este estándar Internacional no determina:

El mecanismo mediante los programas de C son transformados por un sistema de procesamiento de datos.

El mecanismo mediante los programas de C son invocados por un sistema de procesamiento de datos.

El mecanismo por el cual los datos son transformados para su uso en programas de C.

El mecanismo por el cual los datos son transformados tras haber sido producidos por un programa de C.

El tamaño o la complejidad de un programa y sus datos que excederán la capacidad de cualquier sistema de procesamiento de datos específico o la capacidad de un procesador particular.

Todos los requisitos mínimos de un sistema de procesamiento de datos que sea capaz de soportar implementación conforme.

Referencias Normativas Los siguientes documentos normativos contienen disposiciones que, mediante su referencia en este texto, constituyen disposiciones de esta Norma Internacional. Para referencias fechadas, enmiendas subsecuentes o revisiones de cualquiera de estas publicaciones no se aplican. Sin embargo, se alienta a las partes de los acuerdos basados en esta Norma Internacional a investigar la posibilidad de aplicar las ediciones más recientes de los documentos normativos que se indican a continuación. Para referencias sin fecha, se aplica la última edición del documento normativo mencionado. Los miembros de ISO e IEC mantienen registros de las normas internacionales actualmente vigentes.

ISO 31-11: 1992, Cantidades y unidades - Parte 11: Signos y símbolos matemáticos para uso en ciencias físicas y tecnología. ISO / IEC 646, Tecnología de la información - Conjunto de caracteres codificados en ISO de 7 bits para el intercambio de información . ISO / CEI 2382−1: 1993, Tecnología de la información - Vocabulario - Parte 1: Términos fundamentales. ISO 4217, Códigos para la representación de monedas y fondos. ISO 8601, Elementos de datos y formatos de intercambio - Intercambio de información - Representación de fechas y horas. ISO / IEC 10646 (todas las partes), Tecnología de la información - Juego de caracteres universal codificado con múltiples octetos (UCS). IEC 60559: 1989, aritmética binaria de punto flotante para sistemas de microprocesador (anteriormente designada en IEC 559: 1989).

Términos, definiciones y símbolos +TérminoDefiniciónAccesoAcción en tiempo de ejecución para leer o modificar el valor de un objeto.AlineamientoRequisito de que los objetos de un tipo particular se ubiquen en los límites de almacenamiento con direcciones que son múltiplos particulares de una dirección de byte.ArgumentoExpresión en la lista separada por comas delimitada por los paréntesis en una expresión de llamada de función, o una secuencia de tokens de preprocesamiento en la lista separada por comas delimitada por los paréntesis en una macro invocación de función.ComportamientoApariencia o acción externa.Comportamiento definido por la implementaciónComportamiento no especificado donde cada implementación documenta cómo se escoge la opción.Comportamiento de especificación localcomportamiento que depende de las convenciones locales de nacionalidad, cultura e idioma que cada implementación documenta.Comportamiento indefinidoComportamiento, al usar una construcción de programa no portable o errónea o de datos erróneos, para los cuales este Estándar Internacional no impone requisitos.BitUnidad de almacenamiento de datos en el entorno de ejecución lo suficientemente grande como para contener un objeto que tendrá un valor, de dos posibles.ByteUnidad de almacenamiento de datos direccionable lo suficientemente grande como para contener a cualquier miembro del juego de caracteres básico del entorno de ejecución.CarácterMiembro abstracto de un conjunto de elementos utilizados para la organización, control o representación de datos.Carácter multibyteSecuencia de uno o más bytes que representan un miembro del conjunto de caracteres extendido del entorno de origen o de ejecución.Carácter amplioRepresentación de bits que encaja en un objeto de tipo wchar_t, capaz de representar cualquier carácter en el entorno local actual.ConstanteRestricción, ya sea sintáctica o semántica, por la cual se debe interpretar la exposición de elementos del lenguaje.Resultado correctamente redondeadoRepresentación en el formato del resultado que tiene el valor más cercano, sujeto al modo de redondeo efectivo, a lo que se le daría al resultado un rango y precisión ilimitados.Mensaje de diagnósticoMensaje perteneciente a un subconjunto de implementación definido de la salida del mensaje de la implementación.Referencia directaReferencia a una subcláusula posterior de este Estándar Internacional que contiene información adicional relevante a esta subcláusula.ImplementaciónConjunto particular de software, que se ejecuta en un entorno de traducción particular bajo opciones de control particulares, que realiza la traducción de programas y admite la ejecución de funciones en un entorno de ejecución particular.Límite de implementaciónRestricción impuesta a los programas por la implementación.ObjetoRegión de almacenamiento de datos en el entorno de ejecución, cuyo contenido puede representar valores.ParámetroObjeto declarado como parte de una declaración o definición de función que adquiere un valor en la entrada a la función, o un identificador de la lista separada por comas delimitada por paréntesis inmediatamente después del nombre de la macro en una definición de macro similar a una función.Práctica recomendadaEspecificación que se recomienda encarecidamente para cumplir con la intención del estándar, pero que puede ser poco práctico para algunas implementaciones.ValorSignificado preciso del contenido de un objeto cuando se interpreta que tiene un tipo específico.Valor definido por la implementaciónValor no especificado donde cada implementación documenta cómo es la elección.Valor indeterminadoValor no especificado o una representación trampa.Valor no especificadoValor válido del tipo relevante donde este Estándar Internacional no impone requisitos sobre qué valor se elige en ningún caso.

Conformidad En esta Norma Internacional, "debe" se tiene que interpretar como un requisito en una implementación o en un programa; por el contrario, "no debe" tiene que interpretarse como una prohibición.

Si se viola un requisito de "debe" o "no debe" que aparece fuera de una restricción, el comportamiento es indefinido. El comportamiento indefinido se indica de otra manera en esta Norma Internacional por las palabras "comportamiento indefinido" o por la omisión de cualquier definición explícita de comportamiento. No hay diferencia de énfasis entre estos tres; todos describen un "comportamiento indefinido". Un programa que sea correcto en todos los demás aspectos, que opere con datos correctos, que contenga un comportamiento no especificado, será un programa correcto. La implementación no debe traducir con éxito una unidad de traducción de preprocesamiento que contenga una directiva de preprocesamiento #error a menos que sea parte de un grupo omitido por inclusión condicional. Un programa estrictamente conforme debe utilizar solo aquellas características del lenguaje y la biblioteca especificadas en esta Norma Internacional. Un programa estrictamente conforme puede usar características condicionales siempre que el uso esté protegido por una directiva #ifdef con la macro apropiada. No debe producir resultados dependientes de ningún comportamiento no especificado, indefinido o definido por la implementación, y no deberá exceder ningún límite mínimo de implementación. Las dos formas de implementación conforme son alojadas e independientes. Una implementación hospedada conforme deberá aceptar cualquier programa estrictamente conforme. Una implementación independiente conforme deberá aceptar cualquier programa estrictamente conforme que no use tipos complejos y en el que el uso de las características especificadas en la cláusula de la biblioteca se delimite al contenido de los encabezados estándar <float.h>, <iso646.h>, <límites.h>, <stdarg.h>, <stdbool.h>, <stddef.h> y <stdint.h>. Una implementación conforme puede tener extensiones (incluidas funciones de biblioteca adicionales), siempre que no alteren el comportamiento de ningún programa estrictamente conforme. Esto implica que una implementación conforme no reserva identificadores distintos a los reservados explícitamente en esta Norma Internacional. Un programa conforme es uno que es aceptable para una implementación conforme. Los programas estrictamente conformes están destinados a ser máximamente portátiles entre las implementaciones conformes. Los programas conformes pueden depender de características no portables de una implementación conforme. Una implementación debe ir acompañada de un documento que defina todas las características definidas y específicas de la implementación y todas las extensiones.

Entorno Una implementación traduce los archivos fuente C y ejecuta programas en C en dos entornos del sistema de procesamiento de datos, que se denominarán entorno de traducción y ejecución en este estándar internacional.

Sus características definen y restringen los resultados de ejecutar programas escritos en C de acuerdo con las reglas sintácticas y semánticas para implementaciones.

Modelos conceptuales

Entorno de traducción

Estructura del programa No es necesario que todos los programas C se traduzcan al mismo tiempo. Se guarda el texto del programa en unidades llamadas archivos de origen o archivos de preprocesamiento.

Se conoce como unidad de traducción de preprocesamiento al archivo fuente que contiene los encabezados y los archivos fuentes incluidos mediante la directiva de preprocesamiento #include.

La unidad de traducción de preprocesamiento se denomina unidad de traducción.

Las unidades de traducción que han sido traducidas previamente se pueden conservar de forma individual o en bibliotecas.

Las unidades de traducción separadas de un programa se comunican entre sí mediante las llamadas a funciones cuyos identificadores tienen enlace externo, manipulación de objetos cuyo identificadores tienen enlaces enlaces externos o archivos de datos.

Las unidades de traducción se pueden traducir por separado y luego vincularse para dar lugar a un programa ejecutable.

Fases de traducción 1. Los caracteres multibyte del archivo de origen físico se asignan al conjunto de caracteres de origen si es necesario.

2. Cada instancia de un carácter de barra diagonal inversa (\) seguido inmediatamente por una nueva línea de carácter se elimina, uniendo las líneas de origen físico para formar líneas de origen lógico.

3. El archivo fuente se descompone en tokens de preprocesamiento y secuencias de caracteres de espacio en blanco. Un archivo fuente no debe terminar en un token de preprocesamiento parcial o en un comentario parcial. Cada comentario será reemplazado por un carácter espacial.

4. Las directivas de preprocesamiento se ejecutan, las macroinvocaciones se expanden y las expresiones del operador _Pragma se ejecutan. Si coincide una secuencia de caracteres con la sintaxis de un nombre de carácter universal producido por un token de concatenación, el comportamiento es indefinido.