全局变量
- 存储持续性:静态
- 链接性:外部:其他文件可以通过
extern
来引用,且引用时不能初始化。 如果两个文件都有相同的全局变量,会引起符号重定义
// file1.cpp
int a;
// file2.cpp
int a;
# 符号重定义
全局函数
函数的存储持续性:静态
- 函数的链接性:外部
static
用于全局变量
- 存储持续性:静态;
链接性:内部:其他文件无法引用。
// file1.cpp
static int a = 5;
// file2.cpp
extern int a;
# 错误:无法解析的外部符号
可以将
static int a;
放在头文件中,不会出错// file1.h
static int a = 4;
# OK
用于局部变量
存储持续性:静态
-
用于类成员变量
static类成员变量只能在类中声明,类外初始化。最好不要在头文件初始化,否则可能重定义。
// file1.h
class Test {
public:
static int a;
};
// file1.cpp
#include "file1.h"
int Test::a = 4;
# OK
extern
引用其他文件的全局变量,且不能初始化
// file1.cpp
int a = 3;
// file2.cpp
extern int a;
# OK
extern
不能单独使用,必须配合其他文件的全局变量一起使用。// file1.cpp
extern int a;
# 错误:无法解析的外部命令
const
const
的全局变量是内部链接的,可以放在头文件中而不出问题。// file1.h
const int a = 4;
# OK
类声明定义
- 类的函数在类内定义时,应该写在头文件中,不会出错。
- 类的函数在类外定义时,不应该写在
.h
文件中,会出现重定义错误。 - 类的静态函数可以在类内定义,写在头文件中;也可以在类外定义,写在头文件中。
- 类的静态成员变量,必须在类外定义,不应该写在
.h
文件中,否则重定义。 - 全局函数可以包装为类的静态函数,从而通过头文件发布。