関数またはマクロの選択での推奨事項

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 回だけ発生します。 マクロはコード サイズを増やす可能性がありますが、関数呼び出しに関連するオーバーヘッドはありません。

  • 関数の評価 関数はアドレスに評価されます。マクロは評価されません。 したがって、ポインターを必要とするコンテキストではマクロ名を使用できません。 たとえば、関数のポインターは宣言できますが、マクロのポインターは宣言できません。

  • 型チェック 関数を宣言するときに、コンパイラは引数の型を確認できます。 マクロを宣言できないため、コンパイラはマクロ引数の型をチェックできません。ただし、マクロに渡す引数の数をチェックすることはできます。

関連項目

ジェネリック型数値演算
C ランタイム (CRT) と C++ 標準ライブラリ (STL) .lib ファイル