![article thumbnail image](https://blog.kakaocdn.net/dn/ZDXgY/btqBqjDY5aR/8THEvaikoprQXke8pb5Uk0/img.png)
선행처리기와 매크로
선행처리: 컴파일 이전의 처리
소스 파일은 컴파일러에 의해 컴파일 되기 이전, 선행처리기에 의해 선행처리 과정을 거치게 된다. 이때 선행처리기는 삽입해 놓은 선행처리 명령문대로 소스 코드의 일부를 단순 치환(substitution) 한다.
선행처리 명령문은 # 문자로 시작하며, 선행처리기에 의해 실행되는 문장이기 때문에 세미콜론(;)을 붙이지 않는다. 다음은 코드 내 PI 라는 문자를 3.14로 치환하기 위한 코드이다.
#define PI 3.14
선행처리 명령문은 '지시자', '매크로', '매크로 몸체(대체 리스트)'의 세 부분으로 구분할 수 있다.
지시자: 선행처리기가 프로그래머가 지시하는 바를 파악하기 위한 부분
매크로: 매크로 몸체로 치환될 부분, 매크로 이름은 대문자로 정의하는 것이 일반적임
매크로 몸체: 매크로를 치환할 부분
매크로는 매개변수가 있는 형태로도 정의할 수 있다. 이처럼 매개변수가 존재하는 매크로를 함수와 유사한 매크로, 매크로 함수라고 부르기도 한다.
#define SQUARE(X) X*X //((X)*(X))
SQUARE(777); 이라는 문장은 777*777으로 변경된다.
정상적으로 값을 출력하기 위해서는 매크로 함수를 정의할 때 매크로의 몸체부분을 구성하는 X와 같은 전달인자 하나하나에 괄호를 하고, 전체를 괄호로 한 번 더 묶어 줘야 한다. 상단 예제는 사실 ((X)*(X))라고 적어야 옳은 표기법이다.
인라인 함수
in(내부)-line(프로그램 코드 라인)
다음 예제는 키워드 inline의 선언을 통해 인라인 함수 SQUARE를 선언한다. 그리고 메인 메소드에서 SQUARE 함수를 호출하고 있다. 인라인 함수이기 때문에 몸체부분이 호출문을 대체하게 된다.
매크로를 이용한 함수의 인라인화는 전처리기에 의해 처리되지만, 키워드 inline을 이용한 함수의 인라인화는 컴파일러에 의해서 처리된다. 따라서 컴파일러가 성능에 문제가 있다고 판단할 경우, 이 키워드를 무시하기도 한다. 또한 필요한 경우 일부 함수를 임의로 인라인 처리하기도 한다.
#include <iostream>
inline int SQUARE(int x)
{
return x * x;
}
int main(void)
{
std::cout << SQUARE(5) << std::endl;
std::cout << SQUARE(12 << std::endl;
return 0;
}
매크로 함수 vs 인라인 함수
매크로 함수
자료형에 따른 함수를 별도로 정의할 필요가 없다.
디버깅이 쉽지 않다.
인라인 함수
작은 크기의 함수, 호출의 빈도수가 높은 함수인 경우에만 매크로의 형태로 정의하는 것이 옳다.