2013년 8월 19일 월요일

C/C++ 매크로함수 vs inline 함수

C에서 C++ 의 inline 함수와 비슷하게 사용되는 것이 바로 매크로 함수이다.

매크로 함수도 함수 호출 시 발생하는 오버헤드 없이 함수가 호출되는 곳마다 함수의 내용을
복사해서 넣어준다. 하지만 매크로 함수는 실제로는 함수가 아니다. 매크로 함수를 정의 할 때는 # define 문을 사용하는데, #define 문은 컴파일 전 단계인 선행처리기(preprocessor)에서 처리된다. 선행처리기는 소스 파일의 텍스트를 읽어 컴파일되기 위한 파일로 준비하는 기능을 제공하는데 그 중 #define문은 소스 파일 내의 특정 문자열을 찾아서 문자열로 대치(replace)하는 기능을 제공한다.

!! 매크로 함수는 선행처리기에 의한 문자열 대치 방식으로 호출될 코드를 삽입하지만, 인라인 함수는 컴파일러에 의한 코드 대치 방식으로 호출될 코드를 삽입한다.

문자열 대치 코드대치.. 무슨소리냐!!?? 느낌은 알겠는데 잘 모르겠다..

예제를 살펴보자.



 

#include "stdafx.h"
#include 

using namespace std;

#define ADD(x,y) ((x)+(y)) //x + y
#define MUL(x,y) ((x)*(y)) //x * y

inline int Add(int x, int y);
inline int Mul(int x, int y);

int _tmain(int argc, _TCHAR* argv[])
{
   cout << MUL(10+20, 30+40) << endl;
   cout << Mul(10+20, 30+40) << endl;

   cout << ADD("abc",10) << endl;
   //cout << Add("abc",10) << endl;

   return 0;
}

inline int Add(int x, int y){
   return x + y;
}

inline int Mul(int x, int y){
   return x*y;
}

위의 코드는 매크로와 inline 함수를 사용하였고
정상적 으로 컴파일된다.(//주석된 부분으로 코딩한다면 어떤 결과가 나올까?)
 
여기서 봐야 될 부분은 더하는(Add) 부분이다.
이전에
 
매크로는 문자열대치
인라인은 코드대치
를 한다고 하였다.
 
 
매크로는 멍청한!? 선행처리기가 #define한 부분을 그대로 문자열을 대치하기 때문에
인자의 형검사를 하지않는다. 그렇기 때문에 오류없이 컴파일 되지만 원하지 않는 값을
얻게 될 수 있다.
 
Inline 함수는 똑똑한 컴파일러가 일반함수를 호출할 때처럼 인자의 값들을 계산하고 다음
호출이 수행된다.
 
C표준에는 없던 inline 함수가 C99에 포함되있는 것도 위와같이 여러가지(산술문제 등.)면에서
좋다라고 생각한다.
 
그렇기 때문에 이둘은 선택의 문제가 아니라 inline이 진보된 기술이기 때문에 앞으로 간단한 함수를 매크로로 만들던 것을 inline으로 사용해야 하면 더욱 안정적이라 할수 있겠다.

댓글 없음:

댓글 쓰기