「#define」とインラインは同じように動作しますか?
いいえ、彼らはしません!
マクロ関数とインライン関数には多くの違いがあります。
-評価回数
インライン関数に引数として渡される式は、1回評価されます。
場合によっては、マクロに引数として渡される式は、複数回評価される可能性があります。マクロで引数を使用するたびに、その引数が評価されます。
コードサンプル:
#define max(a,b) (a>b?a:b)
int main()
{
int a = 0;
int b = 1;
int c = max(a++, b++);
cout << a << endl << b << endl;
return 0;
}
意図はおそらく1と2を印刷することでしたが、マクロは次のように拡張されます。
int c = a++ > b++ ? a++ : b++;
bは2回インクリメントされ、プログラムは1と3を出力します。
-誰がそれらを評価するか
インライン関数はコンパイラーによって評価され、マクロはプリコンパイラーによるプリコンパイル時に評価されます。
-タイプチェック
インライン関数は、通常の関数に適用されるタイプセーフティのすべてのプロトコルに従います。引数の型がチェックされ、必要な変換が正しく実行されます。コンパイラは、インライン関数をシンボルテーブルに配置する前に、リターン型チェック、関数シグネチャを実行します。
それらをオーバーロードして、適切な種類のデータに対して適切な種類の操作を実行できます。
マクロは、インライン関数と比較してエラーが発生しやすくなります。パラメータは型指定されていません(マクロは算術型のオブジェクトに対して機能します)。コンパイル中にエラーチェックは行われません。
コードサンプル:
#define MAX(a, b) ((a < b) ? b : a)
int main( void)
{
cout << "Maximum of 10 and 20 is " << MAX("20", "10") << endl;
return 0;
}
整数演算を行うマクロに文字列を渡すことができ、マクロは文句を言いません!
-提案またはコマンド?
インラインはコンパイラへの単なる提案です。関数をインライン展開するかどうかはコンパイラーの決定です。
マクロは常に展開されます。
-デバッグはどうですか?
インライン関数の定義にブレークポイントを設定し、段階的にデバッグする方法にステップインできるため、インライン関数を簡単にデバッグできます。
マクロはコンパイル前に展開されるため、デバッグには使用できません。