[9.5] 単純な古い #define マクロの代わりにインライン関数を使用する必要があるのはなぜですか?
#define
マクロは、悪#1、悪#2、悪#3、悪#4 の 4 つの異なる方法で悪だからです。いずれにせよそれらを使用する必要がある場合もありますが、それでも悪です。マクロとは異なり#define
、インライン関数は常にすべての引数を 1 回だけ評価するため、悪名高いマクロ エラーを回避します。つまり、インライン関数の呼び出しは意味的には通常の関数の呼び出しと同じですが、より高速です。// A macro that returns the absolute value of i #define unsafe(i) \ ( (i) >= 0 ? (i) : -(i) ) // An inline function that returns the absolute value of i inline int safe(int i) { return i >= 0 ? i : -i; } int f(); void userCode(int x) { int ans; ans = unsafe(x++); // Error! x is incremented twice ans = unsafe(f()); // Danger! f() is called twice ans = safe(x++); // Correct! x is incremented once ans = safe(f()); // Correct! f() is called once }
また、マクロとは異なり、引数の型がチェックされ、必要な変換が正しく実行されます。
マクロは健康に悪いです。必要がない限り、それらを使用しないでください。
unsafe(x++)
インクリメントが 2 回ある理由を誰かが説明できますかx
? 私は理解することができません。