# define 지시문 (C/C++)
#define 만듭니다는 매크로, 토큰 문자열와 연결 하는 id 또는 매개 변수가 있는 식별자입니다.매크로 정의한 다음 컴파일러 각 항목의 소스 파일에서 식별자에 대 한 토큰 문자열 대신 사용할 수 있습니다.
구문
#define식별자토큰 문자열선택
#defineidentifier(identifieropt,...,identifieropt)token-stringopt
설명
#define 로 인해 대체할 컴파일러 지시문 토큰 문자열 각 식별자 소스 파일에서입니다.해당 식별자 만 토큰 형성 하면 바뀝니다.즉, 식별자 주석, 문자열, 또는 긴 식별자의 일부로 표시 되는 경우 대체 되지 않습니다.자세한 내용은 C + + 토큰를 참조하십시오.
토큰 문자열 인수 일련의 토큰을 키워드, 상수, 문 완성 등으로 구성 되어 있습니다.해야 하나 이상의 공백 문자를 구분 합니다. 토큰 문자열 에서 식별자.이 공백을 대체 텍스트의 일부로 간주 되지 않습니다 없으며 텍스트의 마지막 토큰 뒤에 오는 공백입니다.
A #define 없이 토큰 문자열 제거 식별자 소스 파일에서입니다.식별자 남아 정의 하 고 사용 하 여 테스트할 수 있습니다의 #if defined 및 #ifdef 지시문입니다.
두 번째 구문 형식 매개 변수를 사용 하는 함수와 비슷한 매크로 정의합니다.괄호로 묶어 표시 해야 하는 매개 변수 목록이이 양식을 사용할 수 있습니다.매크로를 정의 하 고 각 후속 찾은 후 식별자( 식별자수신 동의,..., 식별자수신 동의 ) 버전으로 교체 되는 토큰 문자열 에 대 한 형식 매개 변수를 대체할 실제 인수가 인수.
형식 매개 변수 이름을 표시 합니다. 토큰 문자열 되는 실제 값이 대체 위치를 표시 합니다.여러 번 나타날 수 있습니다 각 매개 변수 이름은 토큰 문자열, 이름은 임의의 순서로 나타날 수 있습니다.인수의 호출에서 매크로 정의에 매개 변수 개수가 일치 해야 합니다.괄호를 자유롭게 사용 하 여 복잡 한 실제 인수가 올바르게 해석 되도록 보장 합니다.
형식 매개 변수 목록에는 쉼표로 구분 됩니다.각 목록에서 이름이 고유 해야 하 고 목록을 괄호로 묶어야 합니다.공백 없이 분리할 수 있습니다 식별자 괄호.선 연결 사용 — 백슬래시를 배치 (\) 줄 바꿈 문자 바로 앞-긴 지시문을 여러 소스 줄에 대 한.끝의 새 줄으로 확장 하는 형식 매개 변수 이름 중 하나를 토큰 문자열.
매크로 두 번째 구문 형식에 정의 된 경우 매크로 호출 인수 목록에서 뒤에 텍스트 인스턴스를 나타냅니다.실제의 인스턴스 다음에 나오는 인수 식별자 소스 파일에 매크로 정의의 해당 형식 매개 변수에 일치 됩니다.각 형식 매개 변수에서 토큰 문자열 는 됩니다 않는 앞 여 stringizing (#), charizing (#@), 또는 토큰 붙여넣기 (##) 연산자를 또는 않습니다 다음에 ## 연산자는 해당 실제 인수로 대체 됩니다.지시문의 형식 매개 변수를 대체 하기 전에 실제 인수에는 매크로 확장 됩니다.(연산자에서 설명 전처리기 연산자입니다.)
두 번째 형식 인수를 갖는 매크로 다음 예제는 설명에 #define 구문:
// Macro to define cursor lines
#define CURSOR(top, bottom) (((top) << 8) | (bottom))
// Macro to get a random integer with a specified range
#define getrandom(min, max) \
((rand()%(int)(((max) + 1)-(min)))+ (min))
인수가 부작용으로는 때때로 예기치 않은 결과 생성 하는 매크로가 발생 합니다.지정 된 형식 매개 변수가 둘 이상의 시간에 나타나지 않을 수 있습니다 토큰 문자열.해당 형식 매개 변수가 파생 작업이 있는 식으로 대체 되는 경우 두 번 이상 식, 부작용을 평가할 수 있습니다.(아래의 예제를 참조 하십시오. 토큰 붙여넣기 연산자 (# #)입니다.)
#undef 지시문 기억 될 식별자의 전처리기 정의 됩니다.참조 하십시오 # undef 지시문 에 대 한 자세한 내용은.
정의 하는 매크로의 이름을에서 발생 하는 경우 토큰 문자열 (심지어 다른 매크로 확장으로 인해), 확장 되지 않은.
두 번째 #define 첫 번째 토큰 시퀀스와 동일 하지 않으면 매크로 이름이 같은 경고 생성에 대 한.
Microsoft 전용
Microsoft C/C++ 새 정의 원래 정의와 구문적으로 동일 한 경우 매크로 재정의할 수 있습니다.즉, 두 개의 정의 매개 변수에 서로 다른 이름을 가질 수 있습니다.이 동작은 다른 ANSI 두 정의 구문적으로 동일 해야 하는 C입니다.
예를 들어, 다음 두 개의 매크로를 제외 하 고 매개 변수 이름을 동일합니다.ANSIC 이러한 재정의 허용 하지 않습니다 있지만 Microsoft C/C++를 오류 없이 컴파일합니다.
#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( a1 * a2 )
반면, 다음 두 개의 매크로 동일 하지 및 Microsoft C/C++에서는 경고를 생성 합니다.
#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( b1 * b2 )
Microsoft 특정 끝
이 예제는 #define 지시문:
#define WIDTH 80
#define LENGTH ( WIDTH + 10 )
첫 번째 명령문은 식별자를 정의 합니다. WIDTH 정수 상수 80으로 정의 하 고 LENGTH 의 WIDTH 및 정수 상수 10.각 LENGTH 으로 바뀝니다 (WIDTH + 10).각 항목에 설정에 WIDTH + 10 식으로 바뀝니다 (80 + 10).둘러싼 괄호는 WIDTH + 10 에서 문 다음과 같이 해석 들을 제어 하기 때문에 중요 합니다.
var = LENGTH * 20;
문의 전처리 단계 후 변경 됩니다.
var = ( 80 + 10 ) * 20;
1800으로 평가합니다.괄호 없이 결과가입니다.
var = 80 + 10 * 20;
280을 평가합니다.
Microsoft 전용
매크로 및 상수를 정의 하는 /D 컴파일러 옵션을 사용 하는 것과 같은 효과는 #define 전처리 지시문을 파일의 시작 부분에./D 옵션을 사용 하 여 최대 30 매크로 정의할 수 있습니다.
Microsoft 특정 끝