#define은 매크로(macro)를 정의하는 전처리기 지시문입니다. 매크로란 식별자(identifier) 또는 매개변수화된 식별자를 특정 토큰 문자열(token string)과 연결해 놓은 것을 의미합니다.
매크로가 한 번 정의되면 컴파일러는 소스 파일 내에서 해당 식별자가 나타나는 모든 위치를 정의된 토큰 문자열로 자동 치환합니다. 즉, 코드가 실제로 컴파일되기 전에 전처리기(preprocessor) 단계에서 텍스트 치환이 일어나는 것입니다.
#define 기본 문법
#define identifier token-string
#define의 동작 방식
#define 지시문은 컴파일러가 소스 파일에서 identifier가 등장할 때마다 이를 token-string으로 대체하도록 만듭니다. 다만, 식별자는 독립적인 토큰(token)을 형성할 때만 치환됩니다.
즉, 다음과 같은 경우에는 식별자가 치환되지 않습니다.
- 주석(comment) 안에 나타나는 경우
- 문자열(string) 리터럴 안에 포함된 경우
- 더 긴 식별자의 일부로 사용되는 경우
예제 코드
#include<iostream>
#define MY_VAR 55
using namespace std;
int main() {
int x = 10;
cout << x + MY_VAR; // 전처리 후 이 표현식은 x + 55로 변환됩니다.
return 0;
}실행 결과
위 코드를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
65
위 예제에서 MY_VAR은 값 55로 정의된 매크로입니다. 전처리기가 실행되면 x + MY_VAR라는 표현식은 x + 55로 치환되며, 따라서 10 + 55인 65가 출력됩니다.
#define 활용 시 참고 사항
#define은 상수 정의뿐만 아니라 함수처럼 동작하는 함수형 매크로(function-like macro)를 만드는 데에도 사용할 수 있습니다. 하지만 현대 C++에서는 타입 안정성이 보장되는 const, constexpr, inline 함수 등을 사용하는 것이 권장됩니다.
#define 지시문에 대한 더 자세한 내용은 MSDN 문서(https://docs.microsoft.com/en-us/cpp/preprocessor/hash-define-directive-c-cpp)에서 확인할 수 있습니다.