関数またはマクロの選択に関する推奨事項

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 ランタイム ライブラリ