关于选择函数和宏的建议
大多数 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
如果您需要在库例程的函数和宏实现之间进行选择,请考虑以下折衷方案:
速度与大小 使用宏的主要好处是执行速度更快。 在预处理期间,宏在被使用时将内联展开(由其定义替换)。 无论调用函数定义多少次,它仅执行一次。 宏可能会增加代码大小,但不会产生与函数调用关联的开销。
函数计算 函数的计算结果为地址;而宏不是。 因此,您不能在需要指针的上下文中使用宏名称。 例如,您可以声明指向函数的指针而不是指向宏的指针。
类型检查 在声明函数时,编译器会检查参数类型。 由于你不能声明宏,因此编译器无法检查宏自变量类型;尽管它可以检查传递给宏的自变量的数目。