#define 지시문 (C/C++)#define directive (C/C++)

#Define 는 식별자 또는 매개 변수화 된 식별자와 토큰 문자열을 연결 하는 매크로를 만듭니다.The #define creates a macro, which is the association of an identifier or parameterized identifier with a token string. 매크로가 정의된 후 컴파일러는 소스 파일에서 발생하는 각 식별자를 토큰 문자열로 대체할 수 있습니다.After the macro is defined, the compiler can substitute the token string for each occurrence of the identifier in the source file.

구문Syntax

#define 식별자 토큰 문자열 opt#define identifier token-stringopt
#define 식별자 ( 식별자옵트인 , ... , 식별자 opt ) 토큰 문자열옵트인#define identifier ( identifieropt, ... , identifieropt ) token-stringopt

설명Remarks

#Define 지시문을 통해 컴파일러는 소스 파일에서 각 식별자 발생에 대 한 토큰 문자열 을 대체 합니다.The #define directive causes the compiler to substitute token-string for each occurrence of identifier in the source file. 식별자 는 토큰을 형성 하는 경우에만 대체 됩니다.The identifier is replaced only when it forms a token. 즉, 식별자가 주석, 문자열 또는 긴 식별자의 일부로 표시 되는 경우에는 식별자 가 대체 되지 않습니다.That is, identifier is not replaced if it appears in a comment, in a string, or as part of a longer identifier. 자세한 내용은 토큰을 참조 하세요.For more information, see Tokens.

토큰 문자열 인수는 키워드, 상수 또는 완전 한 문과 같은 일련의 토큰으로 구성 됩니다.The token-string argument consists of a series of tokens, such as keywords, constants, or complete statements. 하나 이상의 공백 문자는 식별자에서 토큰 문자열 을 구분 해야 합니다.One or more white-space characters must separate token-string from identifier. 이 공백은 대체 텍스트의 일부 또는 대체 텍스트의 최종 토큰 뒤에 오는 공백으로 간주되지 않습니다.This white space is not considered part of the substituted text, nor is any white space that follows the last token of the text.

#define 토큰 문자열이 없는은 소스 파일에서 식별자 의 발생을 제거 합니다.A #define without a token-string removes occurrences of identifier from the source file. 식별자 는 정의 된 상태로 유지 되며 #if defined#ifdef 지시문을 사용 하 여 테스트할 수 있습니다.The identifier remains defined and can be tested by using the #if defined and #ifdef directives.

두 번째 구문 형식에서는 매개 변수를 사용하여 함수 형식 매크로를 정의합니다.The second syntax form defines a function-like macro with parameters. 이 형식은 괄호 안에 표시되어야 하는 매개 변수의 선택 목록을 허용합니다.This form accepts an optional list of parameters that must appear in parentheses. 매크로가 정의 된 후에는 각 후속 식별자( identifieropt, ..., identifieropt )가 실제 인수가 있는 토큰 문자열 인수 버전으로 바뀝니다. 정식 매개 변수를 대체 합니다.After the macro is defined, each subsequent occurrence of identifier( identifieropt, ..., identifieropt ) is replaced with a version of the token-string argument that has actual arguments substituted for formal parameters.

정식 매개 변수 이름이 토큰 문자열 에 표시 되어 실제 값을 대체 하는 위치를 표시 합니다.Formal parameter names appear in token-string to mark the locations where actual values are substituted. 각 매개 변수 이름은 토큰 문자열에 여러 번 나타날 수 있으며 이름은 순서에 관계 없이 나타날 수 있습니다.Each parameter name can appear multiple times in token-string, and the names can appear in any order. 호출의 인수 개수는 매크로 정의의 매개 변수 개수와 일치해야 합니다.The number of arguments in the call must match the number of parameters in the macro definition. 괄호를 자유롭게 사용하여 복잡한 실제 인수가 올바르게 해석되도록 합니다.Liberal use of parentheses guarantees that complex actual arguments are interpreted correctly.

목록의 형식 매개 변수는 쉼표로 구분됩니다.The formal parameters in the list are separated by commas. 목록의 각 이름은 고유해야 하고 목록은 괄호로 묶여야 합니다.Each name in the list must be unique, and the list must be enclosed in parentheses. 식별자 와 여는 괄호를 구분할 수 있는 공백은 없습니다.No spaces can separate identifier and the opening parenthesis. 줄 연결 사용-여러 소스 줄에서\긴 지시문의 경우 줄 바꿈 문자 바로 앞에 백슬래시 ()를 추가 합니다.Use line concatenation — place a backslash (\) immediately before the newline character — for long directives on multiple source lines. 정식 매개 변수 이름의 범위는 토큰 문자열을 종료 하는 새 줄로 확장 됩니다.The scope of a formal parameter name extends to the new line that ends token-string.

매크로가 두 번째 구문 형식으로 정의된 경우, 인수 목록이 그 뒤에 오는 텍스트 인스턴스는 매크로 호출을 나타냅니다.When a macro has been defined in the second syntax form, subsequent textual instances followed by an argument list indicate a macro call. 소스 파일의 식별자 인스턴스 뒤에 오는 실제 인수는 매크로 정의의 해당 형식 매개 변수와 일치 합니다.The actual arguments that follows an instance of identifier in the source file are matched to the corresponding formal parameters in the macro definition. 문자열 화 (#), charizing (#@) 또는 토큰 붙여넣기 (##) 연산자가 아닌 토큰 문자열 의 각 형식 매개 변수는 그 다음에는 ## 연산자가 오지 않고 다음으로 대체 됩니다. 실제 인수입니다.Each formal parameter in token-string that is not preceded by a stringizing (#), charizing (#@), or token-pasting (##) operator, or not followed by a ## operator, is replaced by the corresponding actual argument. 실제 인수의 모든 매크로는 지시문이 형식 매개 변수를 대체하기 전에 확장됩니다.Any macros in the actual argument are expanded before the directive replaces the formal parameter. 연산자는 전처리기 연산자에 설명 되어 있습니다.(The operators are described in Preprocessor operators.)

인수가 있는 매크로의 다음 예는 #define 구문의 두 번째 형태를 보여 줍니다.The following examples of macros with arguments illustrate the second form of the #define syntax:

// 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))

파생 효과가 있는 인수를 사용하면 매크로가 예기치 않은 결과를 생성하기도 합니다.Arguments with side effects sometimes cause macros to produce unexpected results. 지정 된 형식 매개 변수는 토큰 문자열에 두 번 이상 나타날 수 있습니다.A given formal parameter may appear more than one time in token-string. 해당 형식 매개 변수가 파생 효과가 있는 식으로 대체되는 경우 해당 식은 그 파생 효과로 인해 두 번 이상 계산됩니다.If that formal parameter is replaced by an expression with side effects, the expression, with its side effects, may be evaluated more than one time. 토큰 붙여넣기 연산자 (# #)아래의 예제를 참조 하십시오.(See the examples under Token-Pasting Operator (##).)

#undef 지시문으로 인해 식별자의 전처리기 정의가 무시될 수 있습니다.The #undef directive causes an identifier's preprocessor definition to be forgotten. 자세한 내용은 #undef 지시문을 참조 하십시오.See The #undef Directive for more information.

정의 되는 매크로 이름이 토큰 문자열 에서 발생 하는 경우 (다른 매크로 확장의 결과로도) 확장 되지 않습니다.If the name of the macro being defined occurs in token-string (even as a result of another macro expansion), it is not expanded.

같은 이름을 가진 매크로에 대 한 두 번째 #define 는 두 번째 토큰 시퀀스가 첫 번째와 동일 하지 않으면 경고를 생성 합니다.A second #define for a macro with the same name generates a warning unless the second token sequence is identical to the first.

Microsoft 전용Microsoft Specific

Microsoft C/C++에서는 새 정의가 원래 정의와 구문적으로 동일할 경우 매크로를 재정의할 수 있습니다.Microsoft C/C++ lets you redefine a macro if the new definition is syntactically identical to the original definition. 즉, 두 개의 정의에서 매개 변수 이름은 각기 다를 수 있습니다.In other words, the two definitions can have different parameter names. 이 동작은 두 정의를 어휘 적으로 동일 하 게 해야 하는 ANSI C와는 다릅니다.This behavior differs from ANSI C, which requires that the two definitions be lexically identical.

예를 들어, 다음 두 매크로는 매개 변수 이름만 제외하면 모두 동일합니다.For example, the following two macros are identical except for the parameter names. ANSI C에서는 이러한 재정의를 허용 하지 않지만 Microsoft C/C++ 는 오류 없이 컴파일합니다.ANSI C does not allow such a redefinition, but Microsoft C/C++ compiles it without error.

#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( a1 * a2 )

한편 다음 동일하지 않은 두 매크로는 Microsoft C/C++에서 경고를 생성합니다.On the other hand, the following two macros are not identical and will generate a warning in Microsoft C/C++.

#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( b1 * b2 )

Microsoft 전용 종료END Microsoft Specific

이 예에서는 #define 지시문을 보여 줍니다.This example illustrates the #define directive:

#define WIDTH       80
#define LENGTH      ( WIDTH + 10 )

첫 번째 명령문은 WIDTH 식별자를 정수 상수 80으로 정의하고, LENGTHWIDTH 더하기 정수 상수 10으로 정의합니다.The first statement defines the identifier WIDTH as the integer constant 80 and defines LENGTH in terms of WIDTH and the integer constant 10. LENGTH가 나타날 때마다 (WIDTH + 10)으로 바뀝니다.Each occurrence of LENGTH is replaced by (WIDTH + 10). 또한, WIDTH + 10이 발생할 때마다 (80 + 10) 식으로 바뀝니다.In turn, each occurrence of WIDTH + 10 is replaced by the expression (80 + 10). WIDTH + 10을 묶는 괄호는 다음과 같은 문에서 해석을 제어하기 때문에 중요합니다.The parentheses around WIDTH + 10 are important because they control the interpretation in statements such as the following:

var = LENGTH * 20;

전처리 단계 후 문은 다음과 같아집니다.After the preprocessing stage the statement becomes:

var = ( 80 + 10 ) * 20;

결과 값이 1800으로 계산됩니다.which evaluates to 1800. 괄호가 없을 경우 결과는 다음과 같습니다.Without parentheses, the result is:

var = 80 + 10 * 20;

280로 평가 됩니다.which evaluates to 280.

Microsoft 전용Microsoft Specific

/D 컴파일러 옵션을 사용 하 여 매크로 및 상수를 정의 하는 것은 파일의 시작 부분에서 #define 전처리 지시문을 사용 하는 것과 동일한 효과를 가집니다.Defining macros and constants with the /D compiler option has the same effect as using a #define preprocessing directive at the start of your file. /D 옵션을 사용하여 최대 30 매크로로 정의할 수 있습니다.Up to 30 macros can be defined by using the /D option.

Microsoft 전용 종료END Microsoft Specific

참고자료See also

전처리기 지시문Preprocessor directives