0. 정리에 들어가기 앞서서.. |
오늘은 전처리기에 대해서 정리를 하고자 합니다. 그런데 우리가 프로그래밍을 하면서 전처리기라는 것에 대해서 꼭 알아야만 할까요? 이름도 왠지 어려워 보이는 데, 자주 접하는 단어이기는 하고.. 무슨 일을 하길래 자주 접할 만큼 강조되는 단어일까 싶으실 겁니다.
하지만, 다른 용어들도 처음 접할 때만 어렵다는 느낌이 드는 것과 같이 전처리기라는 용어도 쉽다는 느낌을 얻으실 수 있다고 생각합니다.
그러기 위해서는 오늘도 배움의 연속이겠네요. 그럼 정리를 시작하겠습니다.
1. 전처리기란? |
처음 프로그래밍을 접하는 분들은 #include 또는 #define 만이 전처리기의 전부라고 생각하시는 분들도 계실 것입니다. 하지만, 앞서 말한 두 가지는 전처리기의 일부라고 할수 있습니다.
그럼 전처리기는 뭘까요?
전처리기란 소스 코드를 컴파일 하기 전에 이에 관해서 사전 준비를 하는 것을 말합니다.
작은 프로그램만 구현하신 분들은 확 와닿지 않을 것입니다. 그 이유는 전처리기를 많이 사용하지 않았기 때문입니다. 하지만, 조금만 규모가 커진다면 하나의 cpp 파일 안에 몇 개부터 몇 십 개까지의 헤더 파일이 들어가게 될 것입니다.
이때, 전처리기가 없다면 헤더 파일에 해당하는 코드를 하나의 파일에 넣어야 할 것입니다. 그럼 엄청난 재앙일 것입니다. 따라서 이러한 재앙을 해결할 수 있는 방법이 전처리기의 기능 중 하나라고 할 수 있겠습니다.
방금, 제가 전처리기의 기능 중 하나라고 말씀 드렸는데, 그럼 또 다른 기능이 있다는 말일까요?
네, 전처리기에는 몇 가지의 기능을 하는 전처리기가 있습니다. 지금 부터 전처리기의 종류와 해당하는 기능들을 소개하겠습니다.
2. 전처리기 종류 |
[파일 포함하기]
#include
위에서 말한 것처럼 특정 프로그램 파일을 현재 위치에 첨부하여, 하나의 파일처럼 컴파일할 때 사용합니다. 여러 개의 파일을 프로젝트에 등록을 하면, 서로 설정된 함수나 변수를 사용할 수 있습니다.
프로그램 파일은 보통 개별적으로 저장됩니다. 이후, 개별적으로 저장된 파일들은 당연히 개별적으로 컴파일될 것입니다.
그럼 개별적으로 컴파일된 오브젝트 파일들은 어떻게 하나의 프로그램으로 실행될까요? 이것이 바로 #include를 사용하는 이유입니다. 서로 다른 함수나 기타 정보를 활용하기 위해서 함수형이나 변수형 또는 선언 내용을 다른 파일끼리 연결하는 것입니다.
[조건부 컴파일하기]
#if ~ [#elseif] ~ [#else] ~ #endif
#if
바로 뒤에 상수 똔느 이미 정의된 문자상수가 옵니다. 값이 0이면 다음 줄부터의 내용은 건너 뛰고, 값이 0이 아니면 처리되는 방식으로 진행됩니다.
#ifdef
#if와 비슷합니다. 하지만, 바로 뒤에 나오는 식별자가 #define으로 미리 정의가 되어있으면 처리되고, 그렇지 않으면 건너뜁니다.
#ifndef
if not defined라고 합니다. 즉, 논리 부정이 추가된 #if 입니다.
#else, #elif
전처리기의 조건부 컴파일은 if문의 else와 비슷합니다. 즉, #else를 가지고 있고, else if와 유사하게 #elif도 있습니다. 방식도 이와 유사하다고 생각하시면 됩니다.
#endif
조건부 컴파일의 종료를 나타냅니다. 즉, 마지막엔 이 기호를 적어주셔야 됩니다.
[매크로 정의와 확장]
#define
특성 숫자, 함수, 프로그램 블록을 다른 형태로 변환 지정합니다. 또한, 다양한 선언이 가능합니다.
그리고, 조건은 선언된 그 줄만 해당합니다.
다음 줄로 연결하고자 할 때는 C나 C++에서 했던 것처럼 '\'를 이용하면 됩니다.
#undef
#undef는 그럼 뭘까요? 뭔가 느낌이 #define의 반대의 기능일 것 같다 싶지 않으신가요?
그렇게 생각하셨다면, 맞습니다.
#define으로 정의한 내용을 #undef를 사용하시면 정의된 것이 없었던 일로 됩니다.
[## 토큰 연결 연산자]
토큰 연결 연산자는 두 개의 토큰을 하나의 토큰으로 연결하는 것을 말합니다. 예는 다음과 같습니다.
#define HELLO_PROGRAMMING(name) typedef struct name##_z name##_x
HELLO_PROGRAMMING(obejct);
출력 결과는 다음과 같습니다.
object_z/ object_y
[#pragma]
컴파일레어게 특성 옵션이나 라이브러리 형태 등을 지정하고자 할 때, 사용합니다. 보통, 여러 가지 환경에 프로그래밍을 적용시키고자 할 때, 또는 CPU 및 시스템 특성에 맞도록 추가하거나 삭제할 때, 사용합니다.
참고 출처: wiki / https://ko.wikipedia.org/wiki/C_%EC%A0%84%EC%B2%98%EB%A6%AC%EA%B8%B0
제 글이 도움이 되셨거나 공감이 되시는 부분이 있으셨다면, 밑에 있는 공감 버튼 한 번씩 꾸욱 눌러주시면 감사하겠습니다.
공감 버튼은 저에게 큰 도움이 됩니다. 감사합니다.
'프로그래밍 > C || CPP' 카테고리의 다른 글
[C & C++] if 앞 조건문이 false 경우, 뒷 조건문은 실행할까? (1) | 2017.11.24 |
---|---|
const 멤버 함수와 비 const 멤버 함수 정리 (3) | 2017.09.14 |
[C/C++] rand, srand로 랜덤 뽑기(로또/lotto) 프로그램 만들기 (0) | 2017.06.15 |
[C/C++] 함수포인터(function pointer) 정리 (0) | 2017.05.30 |
[C/C++] 연산자 정리 (0) | 2017.05.28 |
댓글