C语言中static const extern修饰的变量如何定义?
摘要:static关键字 在 C++ 中,static 变量的生命周期贯穿整个程序的执行过程。这是 static 最核心的特性之一。 一句话总结: static 变量只初始化一次,存在于整个程序运行期间,直到程
static关键字
在 C++ 中,static 变量的生命周期贯穿整个程序的执行过程。这是 static 最核心的特性之一。
一句话总结:
static 变量只初始化一次,存在于整个程序运行期间,直到程序结束时被销毁。
详细解释:不同作用域中的 static 变量
1. 函数内的 static 变量(局部静态变量)
#include <iostream>
void counter() {
static int count = 0;
count++;
std::cout << count << std::endl;
}
int main() {
counter();
counter();
counter();
}
//输出
1
2
3
生命周期:从第一次调用函数开始初始化,只初始化一次,直到程序结束。
作用域:只在当前函数内可见。
用途:用于保留函数调用间的状态(计数器、缓存等)。
2. 类中的 static 成员变量
class A {
public:
static int value;
};
int A::value = 10;
生命周期:从程序启动(或第一次使用)到程序结束。
作用域:属于整个类,而不是某个对象。
用途:在类的所有对象之间共享数据。
3. 全局或文件作用域的 static 变量
static int global_var = 100;
生命周期:从程序启动到结束。
作用域:只在当前源文件中可见(内部链接性)。
用途:防止变量被其他文件访问(封装)。
关键点小结:
用法位置
生命周期
作用域
初始化次数
示例用途
函数内
程序整个运行期
当前函数内
只初始化一次
函数调用次数计数器
类中 static 成员
程序整个运行期
所有类实例共享
在类外定义时初始化
配置值,共享状态
文件作用域(全局 static)
程序整个运行期
当前源文件
一次
避免命名冲突
static vs 普通变量
特性
普通局部变量
static 局部变量
存储位置
栈(stack)
静态存储区(data segment)
生命周期
每次进入函数时创建,退出函数时销毁
程序整个运行周期
初始化
每次调用都初始化
只初始化一次
const关键字
const 修饰变量、指针和引用对照表
声明形式
中文含义
是否可改指针指向
是否可改指针指向的数据
int a = 10;
普通变量
✅
✅
const int a = 10;
常量,值不可变
✅
❌(值不可修改)
int* p
指向 int 的普通指针
✅
✅
const int* p 或 int const* p
指向 常量 int 的指针
✅
❌(*p 不可修改)
int* const p
常量指针,不可改变地址
❌
✅
const int* const p
指向常量的常量指针
❌
❌
int& ref = a;
普通引用
❌(引用不能重新绑定)
✅
const int& ref = a;
指向常量的引用(只读引用)
❌
❌
const int& ref = 5;
绑定右值(临时值)
❌
❌
用法技巧总结:
应用场景
推荐写法
说明
不可修改参数(值类型)
void f(const int x)
仅防止函数体内修改
不可修改参数(引用类型)
void f(const std::string& s)
避免复制,防止修改,最常见
函数返回不可修改值
const std::string& getName()
保证返回值不能被改
静态类内常量
static const int MAX = 100;
编译期常量,可直接类内初始化
编译期常量(推荐)
constexpr int x = 100;
C++11 后更推荐
快速记忆
// const修饰*p则*p不能改,修饰p则p存储的地址不能改
const int* p1 = &a; // *p1 不能改
int* const p2 = &a; // p2 不能改
const int* const p3 = &a; // p3 和 *p3 都不能改
extern 是 C++ 中的一个用于声明变量或函数而非定义的关键字,主要用于跨文件共享变量或函数。
总结:
extern 表示:“这个变量/函数是在别处定义的,我这里只是引用它。”
extern
C++ 是编译型语言,编译时每个 .cpp 文件单独编译,链接时才合并。
