C/C++에서 #define을 사용해서 만드는, 함수처럼 보이지만 실제로는 코드 조각을 치환하는 전처리기 명령어입니다.
매크로 함수는 인자의 자료형을 신경쓰지 않으며, 함수가 아니기 때문에 함수 호출 오버헤드가 발생하지 않아 빠르게 동작합니다.
간단한 연산을 여러 번 쓸 때 편리하고, 실제 코드가 삽입되므로 최적화 가능성이 큽니다.
<문법 예시>
#include <iostream>
#define SQUARE(x) ((x) * (x))
using namespace std;
int main() {
cout << SQUARE(3);
return 0;
}
<결과값>
매크로 함수는 타입 안정성을 보장하지 않습니다. 또한 디버깅이 어려우며, 예상치 못한 동작을 할 수도 있습니다.
<예상치 못한 동작 예시>
#include <iostream>
#define SQUARE(x) x * x
using namespace std;
int main() {
cout << SQUARE(3 + 1); // 3 + 1 * 3 + 1 = 7
return 0;
}
<결과>
간단한 치환이 필요할 때 매크로 함수를 사용해도 되지만, 가능하면 인라인 함수를 사용하는 것이 더 안전하게 사용하기엔 더 좋습니다.
만약 매크로 함수를 사용해야 할 땐 반드시 괄호를 정확히 표시해주는 것이 좋습니다.
추가로, 매크로 상수 (예시, #define PI 3.14159) 대신 const/constexpr (const double PI = 3.14159;)를 사용하여 상수를 선언하는 것 또한 같은 이유에서 더 추천합니다.