関数またはマクロの選択での推奨事項
Microsoft ランタイム ライブラリ ルーチンのほとんどは、コンパイルまたはアセンブル済みの関数ですが、いくつかのルーチンはマクロとして実装されます。 ヘッダー ファイルでルーチンの関数バージョンとマクロ バージョンの両方を宣言するときは、マクロ定義が常に関数の宣言の後に示されるため、マクロ定義が優先されます。 関数とマクロの両方として実装されているルーチンを呼び出す場合は、次の 2 つの方法で、関数バージョンを使用するようにコンパイラに強制することができます。
ルーチンの名前をかっこで囲む。
#include <ctype.h> a = _toupper(a); // Use macro version of toupper. a = (_toupper)(a); // Force compiler to use // function version of toupper.
#undef
ディレクティブを使用してマクロ定義を「未定義」にする。#include <ctype.h> #undef _toupper
関数実装とマクロ実装のライブラリ ルーチンのどちらかを選択する必要がある場合は、次のトレードオフを考慮してください。
速度とサイズ マクロを使用する主な利点は、実行時間が短縮されることです。 前処理中、マクロは使用されるたびにインラインで展開 (定義に置き換えられます) されます。 関数定義は、呼び出された回数に関係なく、1 回だけ発生します。 マクロはコード サイズを増やす可能性がありますが、関数呼び出しに関連するオーバーヘッドはありません。
関数の評価 関数はアドレスに評価されます。マクロは評価されません。 したがって、ポインターを必要とするコンテキストではマクロ名を使用できません。 たとえば、関数のポインターは宣言できますが、マクロのポインターは宣言できません。
型チェック 関数を宣言するときに、コンパイラは引数の型を確認できます。 マクロを宣言できないため、コンパイラはマクロ引数の型をチェックできません。ただし、マクロに渡す引数の数をチェックすることはできます。