매크로는 함수 호출을 포함하지 않기 때문에 (상상적으로) 더 효율적입니다. 포인터 오프셋 조회 만 포함하므로보다 쉽게 최적화 할 수 있습니다.
함수 호출은 프로그램이 매크로 정의없이 컴파일 된 경우에도 – 다른 헤더로 컴파일되었거나 소스 파일 내부의 악성 선언으로 컴파일 된 경우에도 동일한 라이브러리에 대한 링크를 허용합니다. 예를 들어, 매크로 가없는 누군가의 "개선 된"ctype.h 버전의 컴파일러 가있는 경우, 함수는 런타임에 여전히 사용됩니다.
우리가 표준을 보면 :
c99
7.1.4 라이브러리 함수 사용
헤더에 선언 된 함수는 헤더에 정의 된 함수와 유사한 매크로로 추가로 구현 될 수 있으므로 헤더가 포함되어있을 때 라이브러리 함수가 명시 적으로 선언 된 경우 아래에 표시된 기술 중 하나를 사용하여 선언이되지 않도록 할 수 있습니다 이러한 매크로의 영향을받습니다. 함수의 매크로 정의는 함수의 이름을 괄호로 묶어 로컬로 억제 할 수 있습니다. 이름 뒤에 매크로 함수 이름의 확장을 나타내는 왼쪽 괄호가 붙지 않기 때문입니다. 동일한 구문상의 이유로, 매크로로 정의 된 경우에도 라이브러리 함수의 주소를 사용할 수 있습니다.
즉, 다음과 같이 쓰는 경우 :
int b = (isdigit)(c);
또는
int (*f)(int) = &isdigit;
int b = f(c);
그런 다음 매크로가 아닌 실제 기능을 호출합니다. 합법적으로 작성할 수도 있습니다.
#undef isdigit
int b = isdigit(c);
또는 ( #include <ctype.h>
직접 또는 전이가 없는 소스 파일에서 ) :
extern int isdigit(int);
int b = isdigit(c);