Phases of translation
C 소스 파일은 컴파일러에 의해 마치 다음 단계들이 정확히 이 순서대로 발생하는 것처럼 처리됩니다. 실제 구현은 동작이 동일하다면 이러한 동작들을 결합하거나 다르게 처리할 수 있습니다.
목차 |
Phase 1
- 소스 문자 집합 은 다음 96개 문자로 구성된 기본 소스 문자 집합 을 단일 바이트 하위 집합으로 포함하는 멀티바이트 문자 집합입니다:
2단계
#include <stdio.h> #define PUTS p\ u\ t\ s /* Line splicing is in phase 2 while macros * are tokenized in phase 3 and expanded in phase 4, * so the above is equivalent to #define PUTS puts */ int main(void) { /* Use line splicing to call puts */ PUT\ S\ ("Output ends here\\ 0Not printed" /* After line splicing, the remaining backslash * escapes the 0, ending the string early. */ ); }
Phase 3
입력이 주어진 문자까지 전처리 토큰으로 파싱되었다면, 일반적으로 다음 전처리 토큰은 이후 분석이 실패하더라도 전처리 토큰을 구성할 수 있는 가장 긴 문자 시퀀스로 간주됩니다. 이것은 일반적으로 maximal munch 로 알려져 있습니다.
int foo = 1; // int bar = 0xE+foo; // 오류: 유효하지 않은 전처리 숫자 0xE+foo int bar = 0xE/*주석은 공백으로 확장됨*/+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; // 오류: bar++ ++ +baz, bar++ + ++baz가 아님 int qux = bar+++/*주석 삽입*/++baz; // OK: bar++ + ++baz
최대한 많이 적용 규칙의 유일한 예외는 다음과 같습니다:
- 헤더 이름 전처리 토큰은 오직 #include 또는 #embed (C23부터) 지시문 내에서만 형성되며, __has_include 및 __has_embed 표현식 내에서 (C23부터) 그리고 #pragma 지시문 내의 구현 정의 위치에서도 형성됩니다.
#define MACRO_1 1 #define MACRO_2 2 #define MACRO_3 3 #define MACRO_EXPR (MACRO_1 <MACRO_2> MACRO_3) // OK: <MACRO_2>는 헤더 이름이 아님
페이즈 4
페이즈 5
참고: 이 단계에서 수행되는 변환은 일부 구현체에서 명령줄 옵션으로 제어할 수 있습니다: gcc와 clang은 - finput - charset 를 사용하여 소스 문자 집합의 인코딩을 지정하고, - fexec - charset 와 - fwide - exec - charset 를 사용하여 문자열 리터럴과 문자 상수에서 인코딩 접두사가 없는 (C11부터) 실행 문자 집합의 인코딩을 지정합니다.
페이즈 6
인접한 string literals 은 연결됩니다.
Phase 7
컴파일이 수행됩니다: 토큰들이 구문 및 의미론적으로 분석되고 번역 단위로 변환됩니다.
페이즈 8
링킹이 발생합니다: 외부 참조를 충족시키기 위해 필요한 번역 단위와 라이브러리 구성 요소들이 프로그램 이미지로 수집되며, 이 이미지는 실행 환경(운영 체제)에서 실행에 필요한 정보를 포함합니다.
참고문헌
- C23 표준 (ISO/IEC 9899:2024):
-
- 5.1.1.2 번역 단계 (p: TBD)
-
- 5.2.1 문자 집합 (p: TBD)
-
- 6.4 어휘 요소 (p: TBD)
- C17 표준 (ISO/IEC 9899:2018):
-
- 5.1.1.2 번역 단계 (p: 9-10)
-
- 5.2.1 문자 집합 (p: 17)
-
- 6.4 어휘 요소 (p: 41-54)
- C11 표준 (ISO/IEC 9899:2011):
-
- 5.1.1.2 번역 단계 (p: 10-11)
-
- 5.2.1 문자 집합 (p: 22-24)
-
- 6.4 어휘 요소 (p: 57-75)
- C99 표준 (ISO/IEC 9899:1999):
-
- 5.1.1.2 번역 단계 (p: 9-10)
-
- 5.2.1 문자 집합 (p: 17-19)
-
- 6.4 어휘 요소 (p: 49-66)
- C89/C90 표준 (ISO/IEC 9899:1990):
-
- 2.1.1.2 번역 단계
-
- 2.2.1 문자 집합
-
- 3.1 어휘 요소
참고 항목
|
C++ 문서
참조:
번역 단계
|