티스토리 뷰
매크로에 관한 여러 내용들은 밑에 링크를 참고하자.
매크로
0. 매크로(macro)의 원리와 이해 // https://ak47001.tistory.com/9
1. 매크로 상수와 함수 :#define Object, Function
2. 조건부 컴파일 위한 매크로 : #if #ifndef #endif #else #elif //
3. 매크로 함수 : 매개변수 결합(#연산자), 문자열화(##연산자) //
4. 매크로 함수 : (심화) 출력 함수 매크로 //
1. 매크로 상수와 함수 :#define Object, Function
#define 은 대표적인 선행처리 명령문이다. 우리가 어떤 대상을 치환하냐에 따라 매크로 상수 또는 매크로 함수로 불린다. 그럼 하나씩 알아가 보자.
#define Object : 매크로 상수
위는 사용 예시에 불가하다. 이 문장만 이해하면 #define Object 를 여러분도 쉽게 사용할 수 있게 된다. 이 문장이 선언되고 밑에 라인부턴 PI 라는 문자를 만나면 3.14의 값을 치환한다. 어렵지 않은 개념이다. 상수라는 이름을 붙인 것도 저 선언 이후 PI 값은 변경 불가하기 때문에 상수라는 이름을 덧붙여 썼다.
#include <stdio.h>
#define PI 3.14
int main(void) {
printf("PI = %g\n", PI); // 3.14의 값이 치환되어 화면에 나타난다.
printf("PI * PI = %g", PI * PI); // 3.14 * 3.14 의 결과값이 화면에 나타난다.
return 0;
}
위의 상황들이 다 이해되는가? 우린 #define Object 를 사용함으로써 코드를 한층 더 이해하기 쉬운 가독성이 좋은 코드로 만들 수 있기에 변하지 않는 의미 있는 값들은 매크로로 사용해야 된다.
#define Function : 매크로 함수
함수라고 다를 건 없다. 이것도 마찬가지로 #define 선언문 이후의 코드라인에서 발견된 SQUARE(X) 는 X*X 로 치환하게 된다. ( X 대문자와 x소문자도 구분하기에 오타 나지 않도록 작성해야 된다. )
예시 코드를 보며 주의해야 될 점들에 대해 설명하겠다
#include <stdio.h>
#define SQUARE(X) X*X
int main(void) {
printf("SQUARE(2) : %d\n", SQUARE(2));
printf("SQUARE(2+1) : %d\n", SQUARE(2+1));
int num = 120 / SQUARE(2);
printf("120 / SQUARE(2) : %d", num);
return 0;
}
실행 결과 대부분 예상치 못한 결과를 보고 놀랄 것이다. 하지만 조금의 이해만 있다면 충분히 해결할 수 있다.
위의 상황은 이렇다. 전처리기는 단순 치환의 목적이기에 매크로 함수를 위와 같이 있는 그대로 치환한다. 그래서 우리가 원하는 값을 얻지 못하는 상황이 발생한다. 그러면 어떻게 하면 좋을까? 그것은 함수 몸체에서 소괄호를 활용하면 해결된다.
바로 소스 파일에 적용해보자
#include <stdio.h>
#define SQUARE(X) ((X)*(X))
int main(void) {
printf("SQUARE(2) : %d\n", SQUARE(2)); // SQUARE(2) -> ( (2) * (2) ) 로 치환
printf("SQUARE(2+1) : %d\n", SQUARE(2+1)); // SQUARE(2+1) -> ( (2+1) * (2+1) ) 로 치환
int num = 120 / SQUARE(2); // 120 / SQUARE(2) -> 120 / ( (2) * (2) ) 로 치환
printf("120 / SQUARE(2) : %d", num);
return 0;
}
int num = 120 / SQUARE(2) 와 SQUARE(2+1) 같이 연산의 순서는 매우 중요하다. 그렇기에 매크로 함수를 정의할 때 여러 고려 사항들이 있기에 정의하기 정말 까다롭다.
정리
'프로그래밍 언어 > C' 카테고리의 다른 글
[C/C++] 조건부 컴파일 위한 매크로 : #if #ifndef #endif #else #elif (0) | 2023.08.28 |
---|---|
[C/C++] 매크로(macro)의 원리와 이해 (0) | 2023.08.26 |
- Total
- Today
- Yesterday
- 빌드과정
- 매크로함수 소괄호
- Linux
- 디폴트값
- GETX
- c++
- 매크로함수 단점
- 깃허브
- merge conflict
- DART
- git cli
- 비토코인
- docker cli
- 매크로함수 장점
- 매크로 상수
- 절차지향언어
- 프론트엔드
- namespace 중복
- github
- 이중 지출
- 슈퍼넷팅
- 사토시 나카모토
- vim
- C
- 범위지정연산자
- 플러터
- CIDR
- OSI 7계층
- 리눅스
- Docker
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |