<개인공부>/[C언어, C++]

[C언어/C++] define 매크로와 inline 함수에 대해서

BlockDMask 2017. 11. 3. 17:00
반응형
  • 안녕하세요. BlockDMask 입니다.

  • 오늘은 inline 함수와 define(매크로)에 대해 정리해볼까 합니다.

A. 매크로(define)와 예시

B. 매크로(define)함수와 예시

C. 인라인(inline)함수와 예시

D. 총 정리

.

A-1. 매크로(define)란


- 여러번 사용하게 될 상수를 문자로 표현하여 변경시에도 편리하게 사용할 수 있도록 하는 것.

- 이러한 매크로 상수는 컴파일 전에 전처리기에 의해서 숫자로 치환 됩니다.


#define [이름] [숫자]


A-2. 매크로(define)사용 예시


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//매크로 예제
 
#include<iostream>
#define MAX_LEN 20
 
using namespace std;
int main(void){
    int * arr = new int[MAX_LEN];
    for(int i=0; i<MAX_LEN; i++){
        arr[i] = i+1;
    }
 
    for(int i=0; i<MAX_LEN; i++){
        cout << arr[i] << " ";
    }
    delete[] arr;
    return 0;
}
cs
  • 이 상황에서 MAX_LEN 이라는 매크로를 사용하지 않고 매직넘버 20 으로 다 채웠을 경우.

  • 데이터의 양이 바뀌어 25까지 계산하려 한다면. 일일히 하나씩 바꿔주어야하지만,

  • 매크로를 사용한 코드에서 맨위의 매크로 하나만 바꾸어 주면 전체가 바뀌어서 사용하기 편리합니다.

B-1. 매크로(define) 함수


- 매크로를 이용하여 함수의 역할을 대신 하는 것 입니다.

- 파라미터를 받을 수 있으며, 반환할 수 있습니다.

- #define 은 단순히 치환을 해 주기 때문에 함수와 달리 예상하는 결과값과 다른 경우가 존재합니다.

- #define 은 전처리기 영역에서 단순 치환이기 때문에 컴파일에서 발생하는 데이터 타입에 관한 문제는 발견하지 못한다.


#define [함수이름](인자, 인자)  [계산]

ex) #define SUM(a, b) (a+b)


B-2. 매크로(define) 함수 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//매크로 함수 예제
 
#include<iostream>
#define SUM(a,b) a+b
#define MUL(a,b) a*b
 
using namespace std;
int func_mul(int a, int b){
    return a*b;
}
int main(void){
    cout << SUM(1020<< endl;
    cout << MUL(1020<< endl;
 
    cout << MUL(10+320+2<< endl;    //예상 결과와 다름
    cout << func_mul(10+320+2<< endl;
 
    return 0;
}
cs


<출력 결과>

  • 첫번째 두번째 까지는 정상적으로 동작합니다.

  • 세번째 매크로 함수와 네번째 일반 함수의 동작이 같을 것이라 예상하고 프로그램을 실행 시켰지만 결과가 다릅니다.

  • 이는 앞서 말한것과 같이 #define 매크로는 단순 치환을 해주기 때문입니다.
    MUL(10+3, 20+2)는 전처리기에 의해
    10+3 * 20 +2 로 계산이 되어 10+60+2 = 72가 나오게 됩니다.

    일반 함수 (func_mul)과 같은 결과가 나오게 하려면
    #define MUL(a, b) ((a)*(b)) 와 같이 선언을 해주어야합니다.


**이렇게 간단한 곱셈 함수도 선언시에 주의할 점이 많은데, 더 복잡한 함수는 ㄷㄷ.. 이겠죠?


C-1. inline(인라인) 이란

  • 매크로 함수의 단점을 보완하고자 일반함수의 성향을 조금 빌려온 함수

  • 컴파일러가 지능적으로 판단하여 인라이닝을 하는 것이 이득이라면 치환을 해주고
    그렇지 않으면 일반 함수 처럼 동작합니다. (컴파일러 너만 믿는다 이런느낌)

  • inline 은 함수 호출처럼 스택으로 불리는 것이 아니라 치환 되어 사용됩니다.

  • 함수 선언시에 inline 을 앞에 붙여주면 됩니다.

inline int func_mul(int a, int b) {return a*b}


C-2. inline 함수의 사용과 예시


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//매크로 함수 예제
 
#include<iostream>
#define MUL(a,b) ((a)*(b))
 
#define MAX(a,b) ((a)>(b)?(a):(b))
 
using namespace std;
 
inline int func_mul(int a, int b){
    return a*b;
}
inline int func_max(int a, int b){
    return a>b?a:b;
}
 
int main(void){
 
    cout << MUL(10+320+2<< endl;     //macro
    cout << func_mul(10+320+2<< endl;//inline
 
    cout << MAX(10,20<< endl;
    cout << func_max(1020<< endl;
 
    cout << MAX(10+3,20+2<< endl;
    cout << func_max(10+320+2<< endl;
 
    return 0;
}
cs


<출력 결과>


D. 총 정리

  • 매크로(define)는 전처리기에 의해 치환(처리)됩니다.

  • inline은 컴파일러의 판단에의해 처리 됩니다. (인라이닝 하느냐 함수로 그냥 처리하느냐)

  • inline 은 데이터 타입을 정의해야 하지만, 매크로(define)은 그렇지 않습니다.

<참고>

https://ko.wikipedia.org/wiki/%EC%9D%B8%EB%9D%BC%EC%9D%B8_%ED%95%A8%EC%88%98

https://namu.wiki/w/%EC%9D%B8%EB%9D%BC%EC%9D%B8%20%ED%95%A8%EC%88%98

감사합니다.

반응형