오늘 배울 내용은 매크로 함수 입니다.
매크로 함수를 배우기 앞서
전처리기라는 것에 대해서 알아둬야 하는데 이 전처리기는 컴파일 하기 앞서 소스파일을 처리하는 컴파일러의 한 부분입니다.
자동으로 실행되며 수정된 소스 파일을 생산합니다. 보통은 컴파일이 끝나면 자동으로 삭제되기 때문에
사용자에게는 보이지 않습니다. 전처리기는 # 기호로 시작하는 전처리기 지시어를 처리합니다. 가까운 예로 #include가 있습니다.
지시어 |
의미 |
#define |
매크로 정의 |
#include |
파일 포함 |
#undef |
매크로 정의 해제 |
#if |
조건이 참일 경우 |
#else |
조건이 거짓일 경우 |
#line |
행 번호 출력 |
#ifdef |
매크로가 정의되어 있는 경우 |
#ifndef |
매크로가 정의되어 있지 않은 경우 |
#endif |
조건 처리 문장 종료 |
이러한 지시자들이 있습니다.
이제 배워볼 매크로는 #define을 지시어로 사용합니다.
매크로에는 단순 매크로와 함수 매크로, 내장되어 있는 내장 매크로 등이 있습니다.
단순 매크로는 숫자 상수를 기호 상수로 만드는 것입니다.
ex) #define PI 3.141592 #define MAX_SIZE 100
이렇게 숫자 상수를 의미있는 기호로 바꾸는 것입니다.
이렇게 기호 상수로 바꾸면 좋은점이 몇가지 있는데, 우선 코드의 가독성이 높아집니다. MAX_SIZE라고 써있는 값이 그냥 상수로 써있다면 코드를 이해하고 있어야 MAX_SIZE라는 것을 알 수 있습니다. 하지만 매크로로 MAX_SIZE라고 써있는 편이 더 많은 정보를 주겠죠?
또 좋은 점은 코드를 수정하기 편리합니다. 그냥 상수로 써있다면 일일이 써있는 모든 곳에 코드를 바꿔줘야 하는데 매크로를 쓰면 #define 문장만 바꿔주면 다 고쳐집니다.
그 외에도 매크로는 텍스트를 다른 텍스트로도 바꿀 수 있으며 논리연산자도 바꿀 수 있습니다. ex) #define Print printf .
함수 매크로는 매크로가 함수처럼 매개변수를 가지는 것입니다.
복잡한 계산이나 자주 쓰이는 공식을 편리하게 사용할 수 있습니다. ex) #define SQUQRE(x) ((x)*(x)) #define MAX(x, y) ((x) > (y)) ? (x) : (y)
매크로가 돌아가는 원리는 전처리기가 소스코드에서 SQUARE를 발견하게 되면 정의된 문자열로 치환하고 x를 매크로 호출시 주어지는 인수로 치환합니다.
매크로에서는 두개 이상의 매개 변수를 가질 수 있으며 예제처럼 변수는 두번이상 쓰일 수 있습니다. 그리고 가장 중요한 장점이자 단점인, 바로 자료형에 영향을 받지 않습니다. SQUARE 매크로 함수에서 실수를 넣든 정수를 넣든 매크로 함수는 올바른 값을 출력합니다. 또한 변수를 포함한 수식도 매개변수가 될 수 있습니다.
마지막으로 이제 매크로 함수를 사용하면서 주의해야하는 몇가지를 알려드리겠습니다.
-매크로를 정의할 때 매개 변수는 모두 사용되어야 합니다.
-매크로 이름과 괄호 사이에 공백이 있으면 안됩니다.
-매개변수는 괄호처리가 되어있어야 합니다.
참고로 한줄 이상의 매크로 함수는 줄의 맨 마지막에 / 을 쓰면 됩니다. ex) #define 2SQUARE(x) ((x)*(x))/
+((x)*(x));
또한 알아두셔야 할게 증감연산자는 매크로 함수에 사용하면 안됩니다.
보시는 것처럼
#define SQUARE(x) ((x)*(x)) 에서 증감연산자를 쓰면 의도한것과 다르게 SQUARE(++x)가 (++x)*(++x) 되기 때문에 1값이 아니라 2값이 증가되어 버립니다.
내장 매크로는 컴파일러가 사용자가 유용하게 사용하는 것을 미리 정의한 것이다.
자주 쓰이는 4개는
_DATE_ |
컴파일된 날짜로 치환된다 (월,일,년) |
_TIME_ |
컴파일된 시간으로 치환된다 (시,분,초) |
_LINE_ |
소스 파일에서의 현재 라인번호로 치환된다. |
_FILE_ |
소스 파일 이름으로 치환된다 |
이외로 알아두셔야 할께 매크로는 ""안에는 건들지 않기 때문에 문자열도 치환하려면 '#'문자열 변환 연산자를 사용해서 바꿔야 합니다.
'알음알음-IT > 개발_기초_코딩_C' 카테고리의 다른 글
초급 C언어 공부 - 5.동적 메모리 할당 (0) | 2020.02.04 |
---|---|
초급 C언어 공부 - 4.구조체(1) (0) | 2020.02.04 |
초급 C언어 공부 - 3.포인터(1) (0) | 2020.02.04 |
초급 C언어 공부 - 1.함수 (0) | 2020.02.04 |