1. 静态存储的变量概述
说明:静态存储是在程序整个运行时间都存在的
变量类型 | 作用域范围 | 生命周期 | 如何声明 |
---|---|---|---|
静态,无链接性 | 函数内有效 | 程序运行期间 | 在代码块中,使用static关键字 |
静态,内部链接性 | 本文件内有效 | 程序运行期间 | 不在任何函数内,使用static关键字,cpp文件间不能共用 |
静态,外部链接性 | 其它文件可引用 | 程序运行期间 | 不在任何函数内,cpp文件间可以共用 |
2. 定义方式
2.1 静态、外部链接性
- 其它文件中引用声明使用关键字extern,且不进行初始化;否则声明为定义,导致分配存储空间
例如:
double up; //< 定义,编译器并初始化为0
extern int blem; //< 其它文件已定义
extern char gr = ‘z’; //< 定义,因为初始化了
2.2 静态、内部链接性
背景:是同一个工程不同文件中,不能出现两次一样的同名变量的定义,除非使用static
代码示例
//! 背景:创建项目的时候,新建了文件file01.h 文件A.cpp 文件B.cpp三个文件
文件:file01.h
#ifndef FILE01_H_
#define FILE01_H_
static int CST_MAX = 20; //< 同一个工程中多个cpp文件都包含了file01文件,从而导致多个文件都分别定义了CST_MAX该变量,
//< 加上static关键字,则使得每个cpp的CST_MAX只有内部链接效果,无外部链接效果
#endif //< FILE01_H_
文件:A.cpp
#include "file01.h"
文件:B.cpp
#include "file01.h"
问题原因:上述文件A和B源文件中分别都包含了文件file01.h,文件A和文件B没有任何关联,属于同一个工程中重复定义了CST_MAX变量两次,所以报错
解决方案:在file01.h文件中的CST_MAX前面加上关键字static即可,让该变量成为每个文件内部链接性(即作用域限定本文件),而无外部链接性
多文件程序中的const限定符
-
结论1:头文件中const 限定的常量后,由多个cpp文件引用,本质是内部链接的,即各自的cpp文件中的const变量是相互独立的,所以不需要加static关键字修饰
-
结论2:如果要想将const限定的常量变为外部链接的,则使用限定符extern,一个源文件中extern const int a = 10定义; 其它源文件中声明使用即可extern const int a; 则代表他们共用1个const常量
3. 参考书籍
C++ Primer Plus(第6版)9.2.5
C++ Primer Plus(第六版)——9.2.7 说明符和限定符