內嵌函式和巨集的比較
雖然內嵌函數是與巨集類似 (因為函式程式碼已展開在編譯時期呼叫處)、 內嵌函式所剖析出的編譯器,而由前置處理器巨集擴充。 如此一來,有幾個重要的差異:
內嵌函式中,請依照下列強制執行一般的函式的型別安全的所有通訊的協定。
內嵌函式會指定為任何其他函式使用相同的語法,不同之處在於它們包含內嵌函式宣告中的關鍵字。
當做引數傳遞至內嵌函式的運算式會評估一次。 在某些情況下,可以多次評估運算式當作引數傳遞給巨集。
範例
下列範例會示範將轉換為大寫的大小寫字母的巨集:
// 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 );
}