编程笔记 - C++ 中应尽量避免使用 "#define"
在 C 语言中,开发者常常使用 #define 预处理指令来定义常量、宏函数或条件编译开关。而在 C++ 编程中,我们应尽量使用语言本身的特性以确保安全性和可控性。
"#define" 的局限性
-
缺乏类型检查:
#define PI 3.1415926 #define SQUARE(x) (x)*(x)PI本质上在预处理阶段被简单替换为文本3.1415926,不会参与类型检查。SQUARE宏对参数的展开可能产生副作用:SQUARE(i++)会导致i自增两次。
-
作用域不受限:宏在定义后一直有效,难以控制其作用域,容易出现命名冲突。
-
难以调试:宏展开后,调试器往往无法正确映射到宏定义,相当于 "隐形" 错误。
1. 使用 "const" 代替常量宏或表达式宏
// c style
#define PI 3.1415926
// c++ style
const double PI = 3.1415926;
//c style
#define SQUARE(x) (x)*(x)
// c++ style
constexpr int SQUARE(int x) { return x * x; }
2. 使用 "enum" 代替整数常量宏
// c style
#define COLOR_RED 0
#define COLOR_GREEN 1
#define COLOR_BLUE 2
// c++ style
enum class Color : uint8_t {
Red = 0,
Green = 1,
Blue = 2,
};
3. 使用 "inline" 代替函数宏
// c style
#define MAX(a, b) ((a) > (b) ? (a) : (b))
// c++ style
template<typename T>
inline T max(T a, T b) {
return (a > b) ? a : b;
}

浙公网安备 33010602011771号