함수와 매크로 중 선택에 대한 권장 사항Recommendations for Choosing Between Functions and Macros

대부분의 Microsoft 런타임 라이브러리 루틴은 컴파일되거나 어셈블된 함수입니다. 그러나 일부 루틴은 매크로로 구현됩니다.Most Microsoft run-time library routines are compiled or assembled functions, but some routines are implemented as macros. 항상 함수 선언 이후에 매크로가 나타나기 때문에 헤더 파일에서 함수 버전의 루틴과 매크로 버전의 루틴을 모두 선언할 때 매크로 정의가 우선 적용됩니다.When a header file declares both a function and a macro version of a routine, the macro definition takes precedence, because it always appears after the function declaration. 함수와 매크로 모두로 구현되는 루틴을 호출할 때 컴파일러에서 다음 두 가지 방법으로 함수 버전을 사용하도록 강제 설정할 수 있습니다.When you invoke a routine that is implemented as both a function and a macro, you can force the compiler to use the function version in two ways:

  • 루틴 이름을 괄호로 묶습니다.Enclose the routine name in parentheses.

    #include <ctype.h>  
    a = _toupper(a);    // Use macro version of toupper.  
    a = (_toupper)(a);  // Force compiler to use   
                        // function version of toupper.  
    
  • 다음 #undef 지시문을 사용하여 매크로 정의를 "정의 해제"합니다."Undefine" the macro definition with the #undef directive:

    #include <ctype.h>  
    #undef _toupper  
    

    라이브러리 루틴의 함수 구현과 매크로 구현 중 하나를 선택해야 하는 경우 다음 사항을 고려해야 합니다.If you need to choose between a function and a macro implementation of a library routine, consider the following trade-offs:

  • 속도 대 크기 매크로 사용 시 주요 장점은 실행 시간이 보다 빠르다는 점입니다.Speed versus size The main benefit of using macros is faster execution time. 전처리하는 동안 매크로는 사용될 때마다 인라인으로 확장됩니다(해당 정의에 의해 교체됨).During preprocessing, a macro is expanded (replaced by its definition) inline each time it is used. 함수 정의는 호출 횟수에 관계없이 한 번만 발생합니다.A function definition occurs only once regardless of how many times it is called. 매크로는 코드 크기를 증가시킬 수 있지만 함수 호출과 관련된 오버헤드는 없습니다.Macros may increase code size but do not have the overhead associated with function calls.

  • 함수 계산 함수는 주소로 계산되지만 매크로는 주소로 계산되지 않습니다.Function evaluation A function evaluates to an address; a macro does not. 따라서 포인터가 필요한 컨텍스트에서 매크로 이름을 사용할 수 없습니다.Thus you cannot use a macro name in contexts requiring a pointer. 예를 들어 함수에 대한 포인터를 선언할 수 있지만 매크로에 대한 포인터는 선언할 수 없습니다.For instance, you can declare a pointer to a function, but not a pointer to a macro.

  • 형식 검사 함수를 선언할 때 컴파일러는 인수 형식을 검사할 수 있습니다.Type-checking When you declare a function, the compiler can check the argument types. 사용자가 매크로를 선언할 수 없기 때문에 컴파일러에서 매크로 인수 형식을 검사할 수 없습니다. 컴파일러에서는 사용자가 매크로에 전달하는 인수 개수를 검사할 수 있습니다.Because you cannot declare a macro, the compiler cannot check macro argument types; although it can check the number of arguments you pass to a macro.

참고 항목See Also

CRT 라이브러리 기능CRT Library Features