안녕하세요. 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(10, 20) << endl; cout << MUL(10, 20) << endl; cout << MUL(10+3, 20+2) << endl; //예상 결과와 다름 cout << func_mul(10+3, 20+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+3, 20+2) << endl; //macro cout << func_mul(10+3, 20+2) << endl;//inline cout << MAX(10,20) << endl; cout << func_max(10, 20) << endl; cout << MAX(10+3,20+2) << endl; cout << func_max(10+3, 20+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
감사합니다.
'<개인공부> > [C언어, C++]' 카테고리의 다른 글
[C언어/C++] rand, srand, time 랜덤함수에 대해서 (난수생성) (37) | 2019.01.11 |
---|---|
[C언어/C++] pow, sqrt 함수에 대해서(루트함수, 제곱, 제곱근) (4) | 2019.01.04 |
[C언어] 동적할당 정리2 (malloc, free 예제) (3) | 2018.10.31 |
[C언어/C++] assert 함수에 대해서 : 디버깅을위한, 더 안전한 코드를 위한 오류 검출 방법 (2) | 2018.10.24 |
[C언어/C++] clock 함수를 통한 알고리즘 시간 측정 (0) | 2017.10.19 |
[C언어/C++] 올림, 내림, 반올림 (floor, ceil) 함수 (8) | 2017.08.11 |
[C언어] 배열포인터, 포인터배열 정리 (pointer) (19) | 2017.07.14 |
[C언어] 동적할당 정리1 (malloc, realloc, calloc, free 함수) (0) | 2017.07.10 |