C++

1. Preprocessor (C++)

영넨이 2025. 11. 21. 19:07
반응형

모든 글에 대한 내용은 아래 cppreference의 내용입니다.

 

https://cppreference.com/

 

cppreference.com

Null-terminated strings:    byte  −   multibyte  −   wide

cppreference.com

 

 

perprocessor - 전처리기

 

전처리기는 컴파일러 전에 번역?(언어를 컴파일하기전? 번역?) 4단계에서 실행된다.

전처리의 결과는 단일 파일로 그때 실제 컴파일러에게 전달된다.

 

Directieves

전처리 지침은 전처리의 행동에 대해 제어한다. 

각 지침은 한줄을 차지하고 다음 형식을 갖는다.

  • the # character
  • a sequence of:
    • 표준 정의 지침 이름은 다음과 같다, 또는
    • 시작된 토큰이 표준 정의 지침의 이름이 아닌 하나 이상의 전처리 토큰, 인 경우 지침은 실행 정의 의미론을 가지고(with) 조건부로 지원한다.
    • 아무것도, 이 경우에는 아무 효과가 없다.
  • a line break. 줄..멈춤?

전처리 지침은 매크로 확장에서 온것이 아니다.

#define EMPTY
EMPTY   #   include <file.h> // not a preprocessing directive

cpp 레퍼런스에 이렇게 되어 있는데, 전처리 지침에는 #문자가 와야함. 근데 EMPTY는 없기 때문에 전처리 지침이 아니다~ 이 뜻이다.

 

그래서 컴파일러가 전처리를 처음에 판단할 때, #이 없기 때문에 EMPTY를 매크로 확장해서 지워 버린다.

 

 

Capabilities

전처리는 소스 파일의 번역? 성능을 가지고 있다.

  • 조건 컴파일 소스파일 부분
  • 연결 가능성 또는 식별자를 인용한면서 텍스트를 교체한다. (concatenating = 결합 , quoting = 변환)
  • 다른 파일을 포함하다.
  • 오류 또는 경고 원인 (발생인듯?)
#define CONCAT(a, b)  a##b   // Concatenating (이어붙이기)
#define QUOTE(a)      #a     // Quoting (문자열 만들기)

int myVar = 10;

// 1. Concatenating 사용
int CONCAT(my, Var) = 20; 
// -> int myVar = 20; 으로 변환됨 (변수 이름을 만듦)

// 2. Quoting 사용
const char* str = QUOTE(myVar); 
// -> const char* str = "myVar"; 로 변환됨 (문자열을 만듦)

CONCAT 매크로는 a,b를 넣으면 a와 b를 변수 이름으로 이어 붙인다. (결과를 붙이는게 아님) 이게 위에서 말한 연결가능성임.

QUOTE 매크로는 들어온 값 a를 문자열로 만들어줌 이게 변수처럼 ""이런게 안붙고 들어오는데 문자열로 변환이 가능함.

 

 

전처리기는 다음 측면을 제어할 수 있다.

  • 구현 정의 행동. 추가적으로, 일부 컴파일러는 연산자 _paragma를 비표전 확장자로서 (as a) 지원한다.
  • 전처리기에서 이용할 수 있는 파일 이름 그리고 줄 정보

 

 

반응형

'C++' 카테고리의 다른 글

2. Conditional inclusion #if #ifdef... (C++)  (0) 2025.11.22