본문 바로가기
C++ 독학/[C++ 독학] 부록

[C++ 독학] 전처리 지시자, 헤더파일

by NpsCause 2022. 3. 11.

전처리 지시자란?

 

C++의 소스코드는 빌드(build)되는 과정에서 전처리 -> 컴파일 -> 링크의 순서를 거칩니다. 

 

그중 전처리(preprocessing) 과정은 프로그램을 컴파일하기 전에 필요한 메타 데이터와 매크로 처리, 파일 포함 및 언어 확장 등의 사전처리 과정을 뜻합니다. 또한 전처리를 하는 프로그램을 전처리기(preprocessor)라고 부릅니다.

 

지시자(지시문)는 C++에서 일반적으로 전처리할때 쓰입니다. '#'으로 시작하며 자주 쓰는 전처리 지시자는 #include, #define, #ifdef 등이 있습니다.

 

 

자주 쓰는 전처리 지시자

 

전처리 지시자 기능 사용 예
#include [파일] 지정한 '파일'의 내용을 지시자 위치에 넣는다. 다른 곳에 정의된 함수를 사용할 목적으로 해당 함수의 선언문이 담긴 헤더파일을 가져온다.
#define [키] [값] 코드에서 '키'에 해당하는 부분을 모두 '값'으로 지정한 내용으로 바꾼다. C에서는 주로 상숫값이나 매크로를 정의한다. 이 때 매크로는 자칫 위험 할 수 있어서 사용에 유의해야 한다.
#if [키]
#elif [키]
#else
#endif
'키'의 값이 참일경우 묶인 코드 블록을 포함시키거나 제외한다.
각 #if 지시문은 #endif 지시문과 일치해야한다. #if 지시문과 #endif 지시문 사이에는 여러 #elif 지시문이 나타 날 수 있지만 #else 지시문은 하나만 사용해야한다. 
소스에 대한 헤더파일 버전문제, C와 C++의 호환성을 맞추기위해 사용되는 경우가있다.
주로 test, debug, develop등 각 과정에서 포함할 파일이 다를수 있는데 이럴 경우에 if 지시문을 사용하여 구분한다.
#ifdef [키]
#endif

#ifndef [키]
#endif
지정한 '키'가 #define 문으로 정의됐는지 여부에 따라 ifdef나 ifndef로 묶인 코드 블록을 포함시키거나 제외한다.
여기서 ifdef는 '...가 정의돼 있다면(if defined)'을, ifndef는 '...가 정의돼 있지 않다면(if not defined)'을 뜻한다.
주로 인클루드 문장이 중복해서 추가되는 것을 막는 용도로 사용한다. #ifndef로 헤더 파일을 불러오면 먼저 '키'값이 정의돼 있는지 확인한 뒤, 없다면 #define 지시자로 그 '키'를 정의한다. 그리고 #endif 지시자로 헤더파일 추가 구문을 닫는다. 이렇게하면 같은 파일이 여러 번 추가되는 것을 방지할 수 있다. 

 

#include의 사용 예

#include <iostream> 	// C++ 내장 헤더파일

#include "userDefineHeader"    // 사용자 정의 헤더파일​

 

#define의 사용 예

#define PI 3.14 	// 3.14대신 PI로 대체 가능

 

#ifdef - #else

#define MAX 0

#ifdef MAX	  	  // MAX가 정의됨 ==> true
#include<iostream>	  // iostream 포함O

#else 		   	  // false
#include<vector>	  // vector 포함X

#endif // ifdef문 끝

 

#if - #else

#define MAX 0

#if MAX			// MAX가 0 ==> false
#include<iostream>	// iostream 포함X

#else	// true
#include<vector>	// vector 포함O

#endif			// #if문 끝

 

헤더파일

 

헤더 파일은 주로 소스파일에 구현할 함수를 선언(declare)하는 용도로 사용됩니다. 이를 함수의 선언부(declaration)라 하고 함수의 호출 방식, 매개변수의 개수와 타입, 리턴 타입 등을 기재하게 됩니다.

 

헤더 파일에 선언한 함수들이 실제적으로 정의되는 파일은 확장자. cpp인 소스파일(source file)에 구현되게 됩니다.

 

즉, 이 말을 정리하면 확장자. h인 헤더 파일에 함수나 클래스를 선언하고 확장자. cpp인 소스파일에 구현(정의)하게 됩니다.

 

ex)

header.h
header.cpp

 

댓글