インライン関数とマクロ
(関数コードがコンパイルの呼び出しの時点で配置されるため) インライン関数がマクロと似ていますがインライン関数はコンパイラによってマクロはプリプロセッサによって配置される場合解析されます。したがって複数の重要な違いがあります :
インライン関数は正規関数に適用されるタイプ セーフのすべてのプロトコルに従います。
インライン関数はそのほかの関数と同じ構文を使用して指定されますが関数宣言に インライン のキーワードを含めます。
インライン関数に引数として渡された式は一度しか評価されません。場合によってはマクロに引数として渡された式には複数回だけ評価できます。
使用例
次の例では大文字と小文字を変換するマクロです :
// 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) から読み込まれ大文字に必要に応じて変換することです。
マクロの実装ではが 「 a 」文字以上であるかどうかを確認し「 z 」 . 以下であるかどうかを判断するにはgetc は一度ずつ実行されますその範囲にある文字を大文字に変換するにはgetc が再実行されます。これは理想として1 つのみを待機すると 2 桁または 3 桁の文字のプログラムの待機を意味します。
インライン関数は前に説明した問題は/LTCG:
// 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 );
}