알음알음-IT/개발_기초_코딩_C

초급 C언어 공부 - 2.매크로 함수

구구닥스 2020. 2. 4. 14:20

오늘 배울 내용은 매크로 함수 입니다.

매크로 함수를 배우기 앞서

전처리기라는 것에 대해서 알아둬야 하는데 이 전처리기는 컴파일 하기 앞서 소스파일을 처리하는 컴파일러의 한 부분입니다.

자동으로 실행되며 수정된 소스 파일을 생산합니다. 보통은 컴파일이 끝나면 자동으로 삭제되기 때문에

사용자에게는 보이지 않습니다. 전처리기는 # 기호로 시작하는 전처리기 지시어를 처리합니다. 가까운 예로 #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_

소스 파일 이름으로 치환된다 

 

이외로 알아두셔야 할께 매크로는 ""안에는 건들지 않기 때문에 문자열도 치환하려면 '#'문자열 변환 연산자를 사용해서 바꿔야 합니다.