1. 정의
#define을 통해 정의된 함수로
컴파일 이전 '전처리기' 단계에서 소스 코드를 대체시키는 원리로 작동한다.
2. 장점
일반 함수를 호출 할 경우 스택에 메모리를 잡게된다.
매크로함수는 코드를 대치시키는 방식으로 작동하기 때문에
컴파일 단계, 메모리 소비에 대한 부담을 덜 수 있다.
3. 사용 예시
적용될 data type을 지정해주기 위해 인자로 type을 받는다. (어떤 타입이건 컴파일시에 유연하게 적용 가능)
4. 예시 코드 (선택 정렬)
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
30
31
|
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX 10000
#define SWAP(a, b, type) do{ \
type temp = a; \
a = b; \
b = temp; \
} while(0)
void selectionSort(int arr[], int size){
int minIndex, min;
for(int i = 0; i < size-1; i++){
minIndex = i;
for(int j = i+1; j < size; j++){
if(arr[j] < arr[minIndex]){
minIndex = j;
}
}
SWAP(arr[i], arr[minIndex], int);
}
}
int main(void){
int arr[10] = {10, 5, 1, 9, 7, 8, 6, 4, 2, 3};
selectionSort(arr, sizeof(arr)/sizeof(int));
for(int i = 0; i < 10; i++){
printf("%d ", arr[i]);
}
return 0;
}
|
SWAP(매크로함수) 을 사용한 곳의 코드가 전처리기 단계에서 그대로 대치된다.
일반 함수를 호출하듯 CODE - STACK SEGEMENT에 메모리 할당 / 해제 과정이 일어나지 않는다.
5. do while(0)은 대체 왜 쓰는건가?
do while을 쓰지 않고 그냥 {} 중괄호 블록으로 묶어 쓰는 경우
- if문을 사용했을때 한줄만 수행되는 현상이 발생할 수 있다.
- 중괄호 뒤에 ; (세미콜론)이 붙어 컴파일 에러가 발생할 수 있다.
C로 코딩하면 흔히 사소한 syntax 디버깅 단계에서 많은 시간이 소요될 수 있다.
이런 주요 기능 활용시에는 사전에 정의해둔 관례를 따르는 것이 개발 속도면에서 편하다.
'C > C' 카테고리의 다른 글
Dangling Pointer (feat. Memory Map) (0) | 2020.03.01 |
---|---|
main 함수 (feat. argc, argv) (0) | 2019.11.10 |
파일 입출력 fopen (0) | 2019.11.10 |
Memory Map 이해하기(Feat.성적처리 프로그램 소스) (0) | 2019.10.02 |
2차원 배열 이해 (0) | 2019.09.29 |