目录
一、const 的作用与区别
1. C语言中的 const
2. C++中的 const
3. C vs C++ 中 const 的核心区别
二、static 的作用与区别
1. C语言中的 static
2. C++中的 static
3. C vs C++ 中 static 的核心区别
三、#define 宏定义 vs const 常量
1. #define 的特性
2. const 的特性
3. #define vs const 核心区别
四、三者在C/C++中的综合对比
1. 同一语言内的对比
C语言
C++
2. 跨语言对比
五、现代C++的最佳实践
一、const
的作用与区别
1. C语言中的 const
2. C++中的 const
3. C vs C++ 中 const
的核心区别
特性 |
C语言 const |
C++ const |
是否编译时常量 |
否 |
是(需初始化) |
默认链接属性 |
外部(extern ) |
内部(static ) |
是否允许作为数组大小 |
否(除非C99 VLA) |
是 |
类型检查 |
弱(可能通过指针修改) |
强(编译期类型安全) |
二、static
的作用与区别
1. C语言中的 static
- 局部静态变量:
- 生命周期延长到程序结束,作用域仅限于定义它的函数。
- 示例:
void func() {
int a = 0; // 普通局部变量
static int b = 0; // 静态局部变量
a++;
b++;
printf("a = %d, b = %d\n", a, b);
}
int main() {
for (int i = 0; i < 3; i++) {
func();
}
return 0;
}
//a = 1, b = 1
//a = 1, b = 2
//a = 1, b = 3
2. C++中的 static
3. C vs C++ 中 static
的核心区别
特性 |
C语言 static |
C++ static |
类内支持 |
不支持 |
支持(静态成员变量/函数) |
作用域控制 |
文件级、函数级 |
同C语言 + 类级 |
内存分配 |
全局静态区 |
全局静态区 |
三、#define
宏定义 vs const
常量
1. #define
的特性
2. const
的特性
3. #define
vs const
核心区别
特性 |
#define |
const |
处理阶段 |
预处理期(文本替换) |
编译期(类型安全检查) |
类型安全 |
无类型,易引发错误 |
有类型,编译器严格检查 |
调试支持 |
不可调试(已被替换) |
可调试 |
作用域控制 |
全局作用域,易命名冲突 |
有作用域限制(如局部/类内) |
常量表达式 |
可用于数组大小、模板参数等 |
C++中支持,C语言中不支持 |
四、三者在C/C++中的综合对比
1. 同一语言内的对比
C语言
const
:仅表示只读变量,无法替代宏定义。
static
:控制作用域和生命周期。
#define
:唯一真正的编译期常量机制。
- 推荐顺序:
#define
> static
> const
(因 const
限制较多)。
C++
const
:支持编译期常量(需初始化),类型安全。
static
:作用域控制 + 类共享数据。
#define
:仅用于复杂宏替换(如条件编译)。
- 推荐顺序:
const
/constexpr
> static
> #define
。
2. 跨语言对比
特性 |
C语言 |
C++ |
const 是否编译期常量 |
否 |
是 |
const 默认链接属性 |
外部 |
内部 |
static 类内支持 |
不支持 |
支持 |
#define 类型安全 |
无 |
无 |
推荐常量机制 |
#define |
const 或 constexpr |
五、现代C++的最佳实践
- 替代宏定义:
- 使用
const
或 constexpr
替代 #define
常量(如 constexpr int N = 10;
)。
- 使用
inline constexpr
(C++17)替代全局常量宏。
static
的新用法:
- 类内静态成员变量 +
static_assert
验证编译期常量。
- 类型安全保障:
- 优先使用
const
和 constexpr
提升代码安全性和可维护性。