Home C언어 공부 정리(6/10)-매크로
Post
Cancel

C언어 공부 정리(6/10)-매크로

22/01/06

1. 전처리기

  • 컴파일러에게 특성을 알려주는 키워드
  • #include : 어떤 파일을 사용할 것인가?
    • #include <stdio.h> : built in function
    • #include “파일명” : 사용자 정의 함수
  • #define : 매크로 키워드
  • etc..

2. 프로그램 실행 순서

1
2
3
4
int main() {
    func1();
    func2();
}

함수_실행

  • 프로그램이 실행되면 stack에 함수가 호출되고 사용이 완료된 함수는 소멸(stack에서 제거)
  • main()은 프로그램의 실행과 끝. main이 종료되면 프로그램도 종료

3. 매크로

  • 함수는 호출해서 사용하기 때문에 코드는 짧지만 반복되는 횟수가 많아질수록 속도가 떨어질 수 있다.
  • 매크로는 컴파일시 매크로를 사용하는 부분에 내용이 치환되어 순서대로 실행되기 때문에 속도는 빨라진다. 대신 메모리는 길어진다.
    use_func use_macro

- 사용법

  • 매크로의 이름과 요소의 개수 중요
    1
    
    #define name(param1, param2)  statement
    
    • 실행문은 한줄만 번역
    • 여러문장 번역 시 \로 다음 줄까지 번역
      1
      2
      
      #define name(param) statement1 \
                        statement2 // 위아래 둘다 번역
      

- 사용시 주의점

  • 치환된 매크로의 코드는 순서대로 실행되기 때문에 우선순위를 고려해야 한다.
  • ex) 퍼센트 계산 매크로
1
2
3
4
5
#define percent(part, total) (part / total * 100)

int main() {
    printf("%f%%", percent(30 + 30, 300));
}
  • 치환된 후 코드

    1
    
    printf("%f%%", 30 + 30 / 300 * 100);
    
    • 계산 순서 : 30 + 0.1 * 100 >> 30 + 10 >> 40
    • 결과 : 40%
  • 정확한 결과를 만들기 위해 매크로 수정

1
2
3
4
5
#define percent(part, total) ((part) / (total) * 100) // part, total 모두 값을 모르므로 ()로 한 묶음임을 표시

int main() {
    printf("%f%%", percent(30 + 30, 300));
}
  • 치환된 후 코드

    1
    
    printf("%f%%", (30 + 30) / (300) * 100);
    
    • 계산 순서 : 60 / 300 * 100 >> 0.2 * 100 >> 20
    • 결과 : 20%

- 같은 이름, 다른 인자 개수

  • 알맞은 매크로 사용가능
  • ex)
1
2
3
4
5
6
7
#define sum(x) ((x) + 1)
#define sum(x, y) ((x) + (y))

int main() {
    printf("%d, ", sum(10));
    printf("%d", sum(10, 20));
}

결과 : 11, 20

- 같은 이름, 같은 인자 개수

  • 마지막 매크로만 실행
  • ex)
1
2
3
4
5
6
7
#define sum(x) ((x) + 1)
#define sum(n) ((n) + (n))

int main() {
    printf("%d, ", sum(10));
    printf("%d", sum(10));
}

결과 : 20, 20

- 매크로 안의 매크로

1
2
3
4
5
6
#define year(one) (day(hour)/12)
#define day(mins) ((min)/24)

int main() {
    printf("%d", year(day(576)));
}
  • 함수일 경우 실행 순서
    • year(day(576)) >> year(576/24) >> year(24) >> year(24/12) >> 12
      func
    • 결과 : 12
  • 매크로는 순서대로 진행된다.
  • 실행 순서
    • year(day(576)) >> year(one) >> day(hour)/12
    • day(hour)/12 >> day(mins)/12 >> 576/24/12
      macro
    • 결과 : 12

+

  • 매크로 사용시 결과가 다르게 나올 수 있음
  • 긴 식을 세울 경우 너무 복잡해지기때문에 간단한 식에 사용하는것이 적합
This post is licensed under CC BY 4.0 by the author.

C언어 공부 정리(6/10)-재귀함수

C언어 공부 정리(6/10)-포인터 맛보기

Comments powered by Disqus.