본문 바로가기

프로그래밍

C/C++ 전치리문 #define

C/C++ 전치리문 #define

#include에 이어 이번엔 #define에 대해 적어봅니다.
#define은 상수값을 지정하기 위한 매크로라고 부르며, 상수뿐만 아니라 함수로도
사용할 수 있습니다.

우선 상수로써의 매크로 사용을 살펴보겠습니다.


이렇게 사용하면 됩니다.
위에는 숫자만 해놨지만 사실은 문자열이나, 
다른 define된 상수를 활용한 값도 생성할 수 있습니다.


이런 식으로 쓸 수 있다는 것이죠.
얼핏 보면 전처리기로 쓰는 것보다 차라리 아에 변수를
변경 못하도록 하는 것이 낫지 않나라고 생각하실 수 있습니다.

하지만 차이가 나죠.
전처리기는 말그대로 컴파일 전에 처리하는 것입니다.

define으로 통해 지정된 매크로 상수들은 컴파일시 사용자가 
define으로 선언한 상수들을 설정된 값으로 
모두 치환하고 컴파일이 일어나도록 합니다. 

C++부터는 변수로 선언하고 상수로 취급하도록 하는 const라는 것이 있는데, 
이것은 나중에 포인터를 정리하고 이어 다뤄보겠습니다.

결과적으로 define상수는 코드상 길게 적어지면서 자주 쓰이는 것들,
혹은 가독성을 높이기 위한 의미로 사용한 변수에 대한 치환으로 사용자에게 편의를 제공 한다고 볼 수 있습니다.


이번엔 함수로써의 매크로 사용을 보겠습니다.


단순하게 사각형의 넓이를 갖고 평수를 구하는 함수를 매크로로 선언했습니다.
예제를 하나 작성해서 확인해보겠습니다.

     

제일 아래가 위에 선언한 매크로 함수를 실행을 확인할 수 있는 내용입니다.
컴파일 전에 아래와 같인 치환이 일어나겠지요.
  


둘다 같은 값이 나오는지 실행으로 확인해 보겠습니다.



이렇게 나오게 됩니다. 잘 동작하네요.

 함수로써의 매크로 동작시 주의할 사항은
매개변수로 쓰이는 값들에 대해서 괄호를 쳐주는 것입니다.
다른 함수에서도 매개변수 사용시에 유의해야하는 점이지만, 
계산 시 매개변수가 갖는 연산자 등에 따라 계산 순서가 바뀌는 등의 
문제가 생길 수 있기 때문이지요.

#define은 어떻게 보면 문서편집기 프로그램에서의 찾아바꾸기와 
비슷하다고 볼 수 있습니다
컴파일이 되기전에 소스의 내용들을 사용자가 미리 선언한 내용과 치환을 하니까요.