関数またはマクロの選択に関する推奨事項
ほとんどの 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
ライブラリ ルーチンの関数とマクロ実装を選択する必要がある場合は次のトレードオフについて検討します :
速度とサイズ はマクロを使用する主な利点実行を高速化する行です。プリプロセス時にマクロを使用して配置されるたびに (定義) に置き換えてインラインです。関数定義は一度だけに関係なく動作にはが呼び出されるときに発生します。マクロはコード サイズが大きくなる可能性がある関数呼び出しに関連するオーバーヘッドはありません。
関数評価 A の関数はアドレスに評価します ; マクロは。したがってポインターが必要なコンテキストでマクロ名を使用できません。たとえばマクロまたは関数へのポインターポインターを宣言できます。
関数を宣言するとコンパイラは 型チェック 引数の型をチェックできます。マクロを宣言できないためコンパイラではマクロ引数の型をチェックする ; は引数の数を確認できますがマクロに渡されます。