Phases of translation
El archivo fuente en C es procesado por el compilador como si las siguientes fases tuvieran lugar, en este orden exacto. La implementación real puede combinar estas acciones o procesarlas de manera diferente siempre que el comportamiento sea el mismo.
Contenidos |
Fase 1
- El source character set es un conjunto de caracteres multibyte que incluye el basic source character set como subconjunto de un solo byte, consistente en los siguientes 96 caracteres:
Fase 2
#include <stdio.h> #define PUTS p\ u\ t\ s /* El empalme de líneas ocurre en la fase 2 mientras las macros * se tokenizan en la fase 3 y se expanden en la fase 4, * por lo que lo anterior equivale a #define PUTS puts */ int main(void) { /* Usar empalme de líneas para llamar a puts */ PUT\ S\ ("Output ends here\\ 0Not printed" /* Después del empalme de líneas, la barra invertida restante * escapa el 0, terminando la cadena prematuramente. */ ); }
Fase 3
Si la entrada ha sido analizada hasta un carácter dado, el siguiente token de preprocesamiento generalmente se toma como la secuencia más larga de caracteres que podría constituir un token de preprocesamiento, incluso si eso causara que el análisis posterior falle. Esto se conoce comúnmente como maximal munch .
int foo = 1; // int bar = 0xE+foo; // error: número de preprocesamiento no válido 0xE+foo int bar = 0xE/*Comment expands to a space*/+foo; // OK: 0xE + foo int baz = 0xE + foo; // OK: 0xE + foo int pub = bar+++baz; // OK: bar++ + baz int ham = bar++-++baz; // OK: bar++ - ++baz // int qux = bar+++++baz; // error: bar++ ++ +baz, no bar++ + ++baz int qux = bar+++/*Saving comment*/++baz; // OK: bar++ + ++baz
La única excepción a la regla de máxima coincidencia es:
- Los tokens de preprocesamiento de nombre de cabecera solo se forman dentro de una directiva #include o #embed (desde C23) , en expresiones __has_include y __has_embed (desde C23) y en ubicaciones definidas por la implementación dentro de una directiva #pragma .
#define MACRO_1 1 #define MACRO_2 2 #define MACRO_3 3 #define MACRO_EXPR (MACRO_1 <MACRO_2> MACRO_3) // CORRECTO: <MACRO_2> no es un nombre de cabecera
Fase 4
Fase 5
Nota: la conversión realizada en esta etapa puede ser controlada por opciones de línea de comandos en algunas implementaciones: gcc y clang utilizan - finput - charset para especificar la codificación del conjunto de caracteres fuente, - fexec - charset y - fwide - exec - charset para especificar las codificaciones del conjunto de caracteres de ejecución en los literales de cadena y constantes de caracteres que no tienen un prefijo de codificación (desde C11) .
Fase 6
Los literales de cadena adyacentes se concatenan.
Fase 7
La compilación tiene lugar: los tokens se analizan sintáctica y semánticamente y se traducen como una unidad de traducción.
Fase 8
El enlace tiene lugar: Las unidades de traducción y los componentes de biblioteca necesarios para satisfacer las referencias externas se recopilan en una imagen de programa que contiene la información necesaria para su ejecución en su entorno de ejecución (el SO).
Referencias
- Estándar C23 (ISO/IEC 9899:2024):
-
- 5.1.1.2 Fases de traducción (p: TBD)
-
- 5.2.1 Juegos de caracteres (p: TBD)
-
- 6.4 Elementos léxicos (p: TBD)
- Estándar C17 (ISO/IEC 9899:2018):
-
- 5.1.1.2 Fases de traducción (p: 9-10)
-
- 5.2.1 Juegos de caracteres (p: 17)
-
- 6.4 Elementos léxicos (p: 41-54)
- Estándar C11 (ISO/IEC 9899:2011):
-
- 5.1.1.2 Fases de traducción (p: 10-11)
-
- 5.2.1 Conjuntos de caracteres (p: 22-24)
-
- 6.4 Elementos léxicos (p: 57-75)
- Estándar C99 (ISO/IEC 9899:1999):
-
- 5.1.1.2 Fases de traducción (p: 9-10)
-
- 5.2.1 Conjuntos de caracteres (p: 17-19)
-
- 6.4 Elementos léxicos (p: 49-66)
- Estándar C89/C90 (ISO/IEC 9899:1990):
-
- 2.1.1.2 Fases de traducción
-
- 2.2.1 Conjuntos de caracteres
-
- 3.1 Elementos léxicos
Véase también
|
Documentación de C++
para
Fases de traducción
|