它能做什么
如果您阅读 Plauger 的The Standard C Library (1992),您将看到<stdio.h>
头文件被允许提供getchar()
并getc()
作为类似函数的宏(具有getc()
多次评估其文件指针参数的特殊权限!)。然而,即使它提供了宏,实现也必须提供执行相同工作的实际函数,主要是为了让您可以访问一个名为getchar()
or的函数指针getc()
并将其传递给其他函数。
也就是说,通过这样做:
#include <stdio.h>
#undef getchar
extern int some_function(int (*)(void));
int core_function(void)
{
int c = some_function(getchar);
return(c);
}
正如所写,这core_function()
是毫无意义的,但它说明了这一点。isxxxx()
例如,您也可以对其中的宏执行相同的操作<ctype.h>
。
通常,您不想这样做 - 您通常不想删除宏定义。但是,当您需要真正的功能时,您可以掌握它。提供库的人可以模拟标准C库的功能,效果很好。
很少需要
另请注意,您很少需要使用显式的原因之一#undef
是您可以通过编写以下代码来调用函数而不是宏:
int c = (getchar)();
因为后面的记号getchar
不是(
,它不是类函数宏的调用,所以它一定是函数的引用。同样,上面的第一个示例即使没有#undef
.
如果您使用宏覆盖实现自己的函数,则可以使用它来获得良好的效果,尽管除非解释,否则可能会有些混乱。
/* function.h */
…
extern int function(int c);
extern int other_function(int c, FILE *fp);
#define function(c) other_function(c, stdout);
…
/* function.c */
…
/* Provide function despite macro override */
int (function)(int c)
{
return function(c, stdout);
}
函数定义行不调用宏,因为后面的记号function
不是(
。该return
行确实调用了宏。