内联函数与宏

虽然内联函数类似于宏(因为在编译时进行调用会展开函数代码),但内联函数是通过编译器分析的,而宏是通过预处理器展开的。 因此,存在很多重大差异:

  • 内联函数遵循对正常函数强制执行的所有类型安全协议。

  • 使用与任何其他函数相同的语法来指定内联函数,只不过它们在函数声明中包含 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 );
}
  
  

请参见

参考

inline、__inline、__forceinline