전처리기란 컴파일 전에 실행되는 코드로써 #으로 시작한다.
종류로는 include, Macro 그리고 조건부 컴파일(Conditional compilation)이 있다.
1. include
다들 알다시피 컴파일러와 함께 제공되는 헤더파일은 <>를 이용해서 포함시키고, 따로 사용자가 작성한 헤더파일은 소스코드가 있는 경로 기준으로 해서 ""를 이용해서 포함시킨다. 예를 들어서 아래와 같다.
#include <iostream> // 컴파일러에서 제공되는 헤더파일
#include "MemoryBlock.h" // 사용자 정의 헤더파일
2. Macro
Macro에는 #define을 이용해서 만들고 종류는 객체와 유사한 매크로와 함수와 유사한 매크로가 있다.
객체와 유사한 매크로는 다시 대체 텍스트가 있는 것과 없는 것으로 나뉘는데 예를 들면 아래와 같다.
#define MAX_DAMAGE 10000 // 지시자가 있는 매크로
#define MAX_DAMAGE // 지시자가 없는 매크로
위와 같이 MAX_DAMAGE를 매크로로 설정해놓으면 MAX_DAMAGE를 쓴 부분은 컴파일시 10000으로 치환된다.
3. 조건부 컴파일(Conditional Compilation)
코드 출처:출처: https://boycoding.tistory.com/145
#define PRINT_JOE // PRINT_JOE 정의
#include <iostream>
int main()
{
#ifdef PRINT_JOE
std::cout << "Joe" << std::endl; // 이것만 출력됨
#endif
#ifdef PRINT_BOB
std::cout << "Bob" << std::endl;
#endif
PRINT_JOE가 define 되어 있으므로, Joe만 출력하고 Bob은 출력하지 않는다.
#define같은 경우 다양한 환경에서 테스트 해볼 때 사용한다고 하는데, 예전에 github 코드중에 memory pool, object pool, thread pool을 모두 구현하시고 각각의 모드를 #define으로 매크로 설정하고 테스트 하고 싶은 모드를 제외하고 나머지 매크로는 주석처리 하신 코드를 본 적 있는데 그런 방식으로 매크로를 쓰면 유용하게 쓸 수 있을 것 같다.
Reference
https://boycoding.tistory.com/145
'공부 > C || C++' 카테고리의 다른 글
C++ 11 enum class (0) | 2021.07.10 |
---|---|
char*를 cout으로 출력할 경우 주소가 올바르게 나오지 않는 경우 (0) | 2021.07.09 |
C+ 11 스마트 포인터(unique_ptr, shared_ptr, weak_ptr) (0) | 2021.07.07 |
C++ 오버로딩(overloading) vs 오버라이딩(overriding), 가상함수(virtual function) 그리고 다형성(polymorphism) (0) | 2021.07.05 |
C 헷갈리는 char*와 char[] 그리고 string <-> char* 변환 방법 (0) | 2021.07.05 |