宏函数 和 C++ 内联函数
当然可以,下面我会并列展示几个常见例子,对比 宏函数 和 C++ 内联函数 的写法与效果,并指出各自的优劣。
✅ 示例一:平方函数
🔹宏函数写法
#define SQUARE(x) ((x) * (x))
🔹C++内联函数写法
inline int square(int x) {return x * x;
}
📌使用对比
int a = 5;
int b = SQUARE(a + 1); // 展开为 ((a + 1) * (a + 1)) → OK
int c = square(a + 1); // 也是 (6 * 6) = 36,安全
🧨 若写成 #define SQUARE(x) x * x
,就会错:
SQUARE(1 + 2)
→ 1 + 2 * 1 + 2
= 1 + 2 + 2
= 5
❌
✅ 示例二:获取最大值
🔹宏函数写法
#define MAX(a, b) ((a) > (b) ? (a) : (b))
🔹C++内联函数写法(推荐模板)
template<typename T>
inline T max(T a, T b) {return (a > b) ? a : b;
}
📌使用对比
int a = 10, b = 20;
int c = MAX(a++, b++); // ❌ a 或 b 可能被加了两次(副作用问题)
int d = max(a++, b++); // ✅ 只调用一次
✅ 示例三:是否为偶数
🔹宏函数写法
#define IS_EVEN(x) ((x) % 2 == 0)
🔹C++内联函数写法
inline bool is_even(int x) {return x % 2 == 0;
}
📌对比
if (IS_EVEN(4)) { /* OK */ }
if (is_even(4)) { /* OK */ }
两者在这里效果一致,但 inline
更安全、类型明确,调试也方便。
✅ 示例四:交换两个变量
🔹宏写法(有风险)
#define SWAP(a, b) { typeof(a) temp = a; a = b; b = temp; } // GCC专用
🔹C++模板内联函数
template<typename T>
inline void swap(T& a, T& b) {T temp = a;a = b;b = temp;
}
📌对比使用
int x = 3, y = 7;
SWAP(x, y); // ✅ 但依赖 typeof,不是标准
swap(x, y); // ✅ C++标准,类型安全,推荐
📌 总结对比
特性 | 宏函数(#define ) | 内联函数(inline ) |
---|---|---|
替换方式 | 预处理阶段文本替换 | 编译阶段函数调用/展开 |
类型安全 | ❌ 无 | ✅ 有类型检查 |
副作用控制 | ❌ 可能多次求值 | ✅ 每个参数只求值一次 |
可调试性 | ❌ 调试困难 | ✅ 可设置断点查看调用栈 |
模板支持 | ❌ 无 | ✅ 支持泛型(如 max<T> ) |
推荐场景 | 非常短、极简替换 | 绝大多数普通函数操作 |