共用方式為


內嵌函式和巨集比較

雖然內嵌函式類似巨集 (因為函式程式碼會在編譯時期於呼叫的位置展開),但是內嵌函式是由編譯器剖析,而巨集則是由前置處理器展開。 因此,兩者有數項重要的差異:

  • 內嵌函式會遵循一般功能強制執行的所有類型安全通訊協定。

  • 內嵌函式是使用與任何其他函式相同的語法指定,不過它們的函式宣告中會包含 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