#define 지시문(매크로)
함수와 유사한 매크로를 만드는 전처리기 지시어입니다.
#define identifier( argument0, ... , argumentN-1 ) token-string |
---|
매개 변수
항목 | 설명 |
---|---|
identifier |
매크로의 식별자입니다. 현재 컨텍스트에 이미 존재하는 식별자가 있는 매크로에 대한 두 번째 #define은 두 번째 토큰 시퀀스가 첫 번째와 동일하지 않으면 오류를 생성합니다. |
( argument0, ... , argumentN-1 ) |
매크로에 대한 인수 목록입니다. 인수 목록은 쉼표로 구분되고 길이 제한이 없으며 괄호로 묶어야 합니다. 목록의 각 인수 이름은 고유해야 합니다. 어떤 공백도 identifier 매개 변수와 여는 괄호를 구분할 수 없습니다. 줄 연결을 사용하여 긴 지시문을 여러 원본 줄로 분할하려면 줄 바꿈 문자 바로 앞에 백슬래시(\)를 추가합니다. |
token-string [선택 사항] |
매크로의 값입니다. 이 매개 변수는 키워드, 상수 또는 완전한 문과 같은 일련의 토큰으로 구성됩니다. 하나 이상의 공백 문자로 이 매개 변수를 identifier 매개 변수와 구분해야 합니다. 이 공백은 대체 텍스트의 일부로 간주되지 않으며 텍스트의 마지막 토큰 뒤에 오는 공백도 아닙니다. 복잡한 인수가 올바르게 해석되도록 괄호를 자유롭게 사용합니다. identifier 매개 변수의 값이 token-string 매개 변수 내에서 발생하는 경우(다른 매크로 확장의 결과인 경우에도) 확장되지 않습니다. 이 매개 변수를 제외하면 identifier 매개 변수의 모든 인스턴스가 원본 파일에서 제거됩니다. 식별자는 정의된 상태로 유지되며 #if defined, #ifdef 및 #ifndef 지시문을 사용하여 테스트할 수 있습니다. |
설명
원본 파일에서 #define 지시문 다음에 발생하는 identifier 매개 변수의 모든 인스턴스는 매크로 호출을 구성하며 식별자는 형식 매개 변수를 대체하는 실제 인수가 있는 token-string 매개 변수의 버전으로 대체됩니다. 호출의 매개 변수 수는 매크로 정의의 매개 변수 수와 일치해야 합니다. 식별자는 토큰을 형성할 때만 바꿔집니다. 예를 들어, 주석, 문자열 또는 더 긴 식별자의 일부로 나타나는 식별자는 바꿔지지 않습니다.
#undef 지시어는 전처리기에 식별자 정의를 잊도록 지시합니다. 자세한 내용은 #undef 지시문(DirectX HLSL)을 참조하세요.
/D 컴파일러 옵션으로 상수를 정의하면 파일 시작 부분에서 #define 지시문을 사용하는 것과 동일한 효과가 있습니다. /D 옵션으로 최대 30개의 매크로를 정의할 수 있습니다.
매크로 호출의 실제 인수는 매크로 정의의 해당 공식 인수와 일치합니다. 인수 앞에 문자열화(#), 문자 지정(#@) 또는 토큰 붙여넣기(##) 연산자가 오거나 뒤에 ## 연산자가 오는 경우가 아니면 토큰 문자열의 각 형식 인수가 해당 실제 인수로 대체됩니다. 실제 인수의 모든 매크로는 지시문이 형식 매개 변수를 대체하기 전에 확장됩니다.
HLSL 컴파일러의 토큰 붙여넣기는 C 컴파일러의 토큰 붙여넣기와 약간 다릅니다. 붙여넣은 토큰은 그 자체로 유효한 토큰이어야 합니다. 예를 들어, 다음 매크로 정의를 고려합니다.
#define MERGE(a, b) a##b
MERGE(float, 4x4) test;
C 컴파일러에서 결과는 다음과 같습니다.
float4x4 test
그러나 HLSL 컴파일러에서 결과는 다음과 같습니다.
float4 x4 test
대신 다음 매크로 정의를 사용하여 이 문제를 해결할 수 있습니다.
MERGE(MERGE(float, 4), x4) test;
예제
다음 예에서는 매크로를 사용하여 커서 줄을 정의합니다.
#define CURSOR(top, bottom) (((top) << 8) | (bottom))
다음 예에서는 지정된 범위에서 의사난수 정수를 검색하는 매크로를 정의합니다.
#define getrandom(min, max) \
((rand()%(int)(((max) + 1)-(min)))+ (min))