매크로함수 (feat. SWAP)

2020. 3. 4. 10:55·C/C

 

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
'C/C' 카테고리의 다른 글
  • Dangling Pointer (feat. Memory Map)
  • main 함수 (feat. argc, argv)
  • 파일 입출력 fopen
  • Memory Map 이해하기(Feat.성적처리 프로그램 소스)
M_Falcon
M_Falcon
  • M_Falcon
    Falcon
    M_Falcon
  • 전체
    오늘
    어제
    • 분류 전체보기 (432)
      • Web (16)
        • Nodejs (14)
        • Javascript (23)
        • FrontEnd (4)
      • DataBase (39)
        • Fundamental (1)
        • Redis (4)
        • PostgreSQL (10)
        • NoSQL (4)
        • MySQL (9)
        • MSSQL (3)
        • Error (4)
      • Algorithm (79)
        • Algorithm (문제풀이) (56)
        • Algorithm (이론) (23)
      • JVM (65)
        • Spring (13)
        • JPA (5)
        • Kotlin (13)
        • Java (24)
        • Error (7)
      • 기타 (70)
        • Kafka (3)
        • Kubernetes (3)
        • Docker (13)
        • git (19)
        • 잡동사니 (27)
      • 재테크 (11)
        • 세무 (4)
        • 투자 (3)
        • 보험 (0)
      • BlockChain (2)
        • BitCoin (0)
      • C (32)
        • C (10)
        • C++ (17)
        • Error (3)
      • Low Level (8)
        • OS (3)
        • 시스템 보안 (5)
      • 네트워크 (3)
      • LINUX (30)
        • Linux (26)
        • Error (4)
      • 저작권과 스마트폰의 이해 (0)
      • 생각 뭉치 (6)
      • 궁금증 (2)
      • Private (4)
        • 이직 경험 (0)
        • 꿈을 찾아서 (1)
      • Android (21)
        • OS (4)
  • 블로그 메뉴

    • 홈
    • WEB
    • 알고리즘
    • DataBase
    • Linux
    • Mobile
    • C
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    kafka
    PostgreSQL
    docker
    java
    알고리즘
    Git
    linux
    프로그래머스
    JPA
    Kotlin
    C++
    javascript
    Spring
    ubuntu
    android
    백준
    Bitcoin
    algorithm
    Programmers
    database
  • hELLO· Designed By정상우.v4.10.3
M_Falcon
매크로함수 (feat. SWAP)
상단으로

티스토리툴바