[C++] 선행처리자에 대한 이야기( 매크로 함수 #define, const 상수, 인라인 함수 inline)

컴파일하는 과정


프로그래머가 작성한 소스파일은 가장 먼저 소스파일에 대한 처리를 하는 선행처리기를 거치고, 컴파일 되어 오브젝트 파일이 생성되고, 다시 링커에 의해 실행파일이 된다.



선행처리를 위한 명령에는#define,, #undef, #include, #if, #ifdef, #elif, #else 등

맨 앞에 #기호가 붙는다는 공통점이 있다.


함수 외부에 기술하며, 다른 소스파일들과는 독립적으로 수행된다. 억지로 취소하지 않는 한 그 효과는 지정한 곳부터 끝까지이다. 선행처리에 합당한 적업을 통해 원시코드의 내용을 변경한다.


#include의 경우에는 이 이후에 나오는 파일을 찾아 그 파일에 기술된 모든 내용을 현재 파일의 #include가 기술된 부분에 넣어준다.



매크로 상수 #define 


상수만 기술하며, 프로그램의 명확성을 증대시켜 주는 효과가 있다.


Ex >  #define PI 3.141592 


+ 단점(2018.01.04)


1. 선행 처리자가 상수로 바꾸어 버리기 때문에, 시호 테이블에 들어가지 않음.

따라서 에러메시지엔 3.141592 값인 숫자만 표기되고, 어디서 에러가 발생했는지 모르므로 혼란을 야기함. 


2. 코드 크기가 증가한다.

선행처리자가 상수 값으로 치환하기 때문에 코드 크기가 커진다.


const 상수


#define문 보다 더 쉽게, 안전하게 상수를 만드는 방법!


변수 선언을 초기화와 함께하고 자료형 앞에 const 키워드를 덧붙여서 상수를 정의할 수 있다. 키워드 const를 덧붙인다는 것과 초기값을 반드시 주어야 한다는 것에 주의 해야한다. const 상수는 변수 선언시 준 초기값이 영원히 그 변수의 값이 된다.



인라인 함수 Inline 함수


주로 짧은 명령어로 구성하고! (길면 비효율적) => 실행 속도가 증가합니다! Inline 함수는 매크로 함수와 유사한 기능을 가진 함수이다. 인라인 함수를 호출하면 컴파일할 때 호출하는 부분에 인라인 함수를 대치한다.


사용 방법

inline  자료형 함수이름 (매개변수 리스트)

{
}


함수 머리 부분의 자료형 앞에 inline이라는 예약어만 추가적으로 기술하면 된다.


속도 증가의 이유는?


일반 함수의 경우 함수의 호출이 일어나면 그 함수를 찾아가서 수행을 하고 다시 되돌아와야 한다. 정의된 함수에 프로그램 로직이 들어 있기 때문.

매크로 함수의 경우 치환될 문장이 함수 부분에 대치되므로 코드 양이 많아지기는 하지만 함수를 찾아 가서 수행하고 돌아오는 번거로움이 없다.