[9.5] 为什么我应该使用内联函数而不是普通的旧#define 宏?
因为
#define
宏在 4 种不同的方面是邪恶的:evil#1、evil#2、evil#3 和 evil#4。有时你无论如何都应该使用它们,但它们仍然是邪恶的。与#define
宏不同,内联函数避免了臭名昭著的宏错误,因为内联函数总是对每个参数只计算一次。换句话说,调用内联函数在语义上就像调用常规函数一样,只是更快:// 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++)
增量x
两次吗?我无法弄清楚。