대부분의 Microsoft 런타임 라이브러리 루틴은 컴파일되거나 어셈블된 함수입니다. 그러나 일부 루틴은 매크로로 구현됩니다. 항상 함수 선언 이후에 매크로가 나타나기 때문에 헤더 파일에서 함수 버전의 루틴과 매크로 버전의 루틴을 모두 선언할 때 매크로 정의가 우선 적용됩니다. 함수와 매크로 모두로 구현되는 루틴을 호출할 때 컴파일러에서 다음 두 가지 방법으로 함수 버전을 사용하도록 강제 설정할 수 있습니다.
루틴 이름을 괄호로 묶습니다.
#include <ctype.h> a = _toupper(a); // Use macro version of toupper. a = (_toupper)(a); // Force compiler to use // function version of toupper.
다음
#undef
지시문을 사용하여 매크로 정의를 "정의 해제"합니다.#include <ctype.h> #undef _toupper
라이브러리 루틴의 함수 구현과 매크로 구현 중 하나를 선택해야 하는 경우 다음 사항을 고려해야 합니다.
속도 대 크기 매크로 사용 시 주요 장점은 실행 시간이 보다 빠르다는 점입니다. 전처리하는 동안 매크로는 사용될 때마다 인라인으로 확장됩니다(정의로 대체). 함수 정의는 호출 횟수에 관계없이 한 번만 발생합니다. 매크로는 코드 크기를 늘릴 수 있지만 함수 호출과 관련된 오버헤드는 없습니다.
함수 평가 함수는 주소로 계산됩니다. 매크로는 그렇지 않습니다. 따라서 포인터가 필요한 컨텍스트에서는 매크로 이름을 사용할 수 없습니다. 예를 들어 함수에 대한 포인터를 선언할 수 있지만 매크로에 대한 포인터는 선언할 수 없습니다.
형식 검사 함수를 선언할 때 컴파일러는 인수 형식을 검사할 수 있습니다. 매크로를 선언할 수 없으므로 컴파일러는 매크로 인수 형식을 확인할 수 없습니다. 매크로에 전달하는 인수 수를 확인할 수 있지만