#define이라는 전처리 문장이 있습니다. 이는 컴파일 전에 먼저 코드에 반영되기 때문에 “前처리” 라고 불립니다.
#define MAX(x, y) ((x) > (y) ? (x) : (y))
define은 상수를 정의하거나 함수 형태로 사용할 수 있습니다. 조금 더 쉽고 정확한 설명은 코드 자체를 치환한다고 생각하면 됩니다.
보통 상수로 쓰는 경우는 코드를 보기 좋게 만드려는게 대부분입니다. 윈도우 창의 크기라던가, 입력받을 수 있는 데이터의 한계라던가, 배열의 크기를 표현할 때 쓰던가가 대표적인 쓰임새입니다.
만약에 배열을 선언할 때 그냥 int score[50];
로 선언한 것과 #define NUM_OF_STUDENT 50
int score[NUM_OF_STUDENT];
로 선언한 것이 있다면, 후자가 왜 크기를 50으로 설정했는지 명확해집니다.
자료형까지 명시해주고 싶다면 const 키워드를 사용하면 됩니다. const int numOfStudent = 50; 과 같이 쓰면 됩니다. const는 꼭 선언과 동시에 초기화를 해주어야 하고, 해당 변수의 변경이 불가능해집니다.
(여담으로 define으로 만드는 것들은 컴파일 에러가 나는 것은 아니지만 전부 대문자를 쓰는게 국룰입니다.)
상수 말고도 함수로도 사용할 수 있습니다. 이 때는 자료형을 요구하지 않습니다.
그 이유는 앞에서 설명했듯이 “코드” 그 자체의 “치환”의 개념에 가깝기 때문입니다. 이는 예시가 더 편할 것 같습니다.
#define ADD(x,y) x+y
int main() {
// code
int sum = ADD(num1, num2);
// code
}
이렇게 짜고나서 컴파일을 하면 컴파일러는 이 코드를 다음과 같이 인식하게 됩니다.
int main() {
// code
int sum = num1+num2;
// code
}
그렇기 때문에 다음에 있어서는 사용에 주의해야 합니다.
#define MUL(x,y) x*y
int main() {
// code
int prod = MUL(num1+1, num2+1);
// code
}