Namespaces
Variants

Preprocessor

From cppreference.net
C++ language
General topics
Preprocessor
Comments
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

전처리기는 번역 단계 4 에서 컴파일 전에 실행됩니다. 전처리의 결과는 단일 파일이며, 이 파일은 실제 컴파일러로 전달됩니다.

목차

지시문

전처리 지시문은 전처리기의 동작을 제어합니다. 각 지시문은 한 줄을 차지하며 다음과 같은 형식을 가집니다:

  • the # 문자.
  • 다음의 시퀀스:
  • 표준에서 정의된 지시문 이름(아래에 나열됨)과 해당 인수, 또는
  • 하나 이상의 전처리 토큰 으로 시작하는 토큰이 표준에서 정의된 지시문 이름이 아닌 경우, 이 지시문은 구현에서 정의된 의미를 가진 조건부 지원 (예: 일반적인 비표준 확장은 컴파일 중 사용자 정의 메시지를 출력하는 지시문 #warning 임) (C++23까지) , 또는
  • 아무것도 아닌 경우, 이 지시문은 아무 효과가 없음.
  • 줄 바꿈.

모듈 및 import 지시문 또한 전처리 지시문입니다.

(since C++20)

전처리 지시문은 매크로 확장에서 비롯되어서는 안 됩니다.

#define EMPTY
EMPTY   #   include <file.h> // 전처리 지시문이 아님

기능

전처리기는 다음과 같은 소스 파일 변환 기능을 갖습니다:

  • 조건부로 소스 파일의 일부를 컴파일 (지시문 #if , #ifdef , #ifndef , #else , #elif , #elifdef , #elifndef (C++23부터) , 그리고 #endif 으로 제어됨).
  • 텍스트 매크로를 대체 하면서 식별자를 연결하거나 인용 (지시문 #define #undef , 그리고 연산자 # ## 으로 제어됨).
  • 다른 파일을 포함 (지시문 #include __has_include 로 확인 (C++17부터) ).
  • 오류 또는 경고 를 발생 (C++23부터) (지시문 #error 또는 #warning 으로 각각 제어됨 (C++23부터) ).

전처리기의 다음과 같은 측면들을 제어할 수 있습니다:

  • implementation-defined 동작 (지시어 #pragma 및 연산자 _Pragma (C++11부터) 에 의해 제어됨). 또한 일부 컴파일러는 __pragma 연산자를 비표준 확장으로 (다양한 정도로) 지원합니다.
  • 파일 이름과 줄 정보 가 전처리기에서 사용 가능함 (지시어 #line 에 의해 제어됨).

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
CWG 2001 C++98 비표준 정의 지시문 사용의 동작이 명확하지 않았음 조건부 지원으로 변경됨

참고 항목

C++ documentation 에 대한 Predefined Macro Symbols
C++ documentation 에 대한 Macro Symbol Index
C documentation 에 대한 preprocessor