内联函数与宏
虽然内联函数类似于宏(因为在编译时进行调用会展开函数代码),但内联函数是通过编译器分析的,而宏是通过预处理器展开的。 因此,存在很多重大差异:
内联函数遵循对正常函数强制执行的所有类型安全协议。
使用与任何其他函数相同的语法来指定内联函数,只不过它们在函数声明中包含 inline 关键字。
计算一次作为内联函数的参数传递的表达式。 在某些情况下,作为宏的参数传递的表达式可计算多次。
示例
下面的示例演示了将小写字母转换为大写字母的宏:
// inline_functions_macro.c
#include <stdio.h>
#include <conio.h>
#define toupper(a) ((a) >= 'a' && ((a) <= 'z') ? ((a)-('a'-'A')):(a))
int main() {
char ch;
printf_s("Enter a character: ");
ch = toupper( getc(stdin) );
printf_s( "%c", ch );
}
表达式 toupper(getc(stdin)) 的用途是,从控制台设备 (stdin) 中读取字符并(如有必要)将该字符转换为大写形式。
由于宏的实现,执行一次 getc 以确定字符是否大于或等于“a”,再将其执行一次以确定字符是否小于或等于“z”。如果它在该范围内,则再次执行 getc 以将其转换为大写形式。 这意味着,程序将等待两个或三个字符,而在理想情况下,它只应等待一个字符。
内联函数纠正了前面所述的问题:
// inline_functions_inline.cpp
#include <stdio.h>
#include <conio.h>
inline char toupper( char a ) {
return ((a >= 'a' && a <= 'z') ? a-('a'-'A') : a );
}
int main() {
printf_s("Enter a character: ");
char ch = toupper( getc(stdin) );
printf_s( "%c", ch );
}