C++ Const、Static以及Extern区别和联系
基础知识:
1.编译单元
编译分为两个步骤:
- 第一步:将每个.cpp或.c和相应的.h文件编译乘obj文件(包含预编译,汇编、编译)
- 第二部:将obj文件进行Link,生成最终的可执行文件
根据该阶段错误大致可分为两类:
- 一个为编译时的错误,大多为语法错误
- 一个为链接时错误,主要是变量、函数定义错误
编译单元指在编译阶段生成的每个obj文件
- 一个obj文件就是一个编译单元
- 一个.cpp或.c和它相应的.h文件共同组成了一个编译单元
- 一个由很多编译单元组成,每个obj文件里包含了变量存储的相对地址等
声明和定义
函数或变量在声明时,并不给它分配实际的物理内存空间,他有时候可以保证程序编译通过
函数或变量在定义时,它就在内存中有了实际的物理空间
如果在编译单元中引用的外部变量没有在整个工程中任何一个地方定义的话,那么即使它在编译时可以通过,链接时也会报错,因为程序内存中找不到这个变量
函数可以声明多次,但是只能定义一次
extern作用
作用1:
当与“C”一起使用时,如 extern “C” void fun(int a, int b),则编译器中fun这个函数名按照c语言规则命名,而不是用c++规定命名。故C++中可以利用该法则调用c函数
作用2:
当他不与“C"在一起修饰变量或者函数时,如在头文件中,extern int g_Num;其作用就是声明函数或者变量的作用范围的关键字,其声明的函数和变量可以在本编译单元或者其他编译单元使用
即b编译单元要引用A编译的单元的全局变量或者函数时,b编译单元只要包含a编译单元的头文件即可,在编译阶段,b编译单元虽然找不到该函数或变量,但是不会报错,他会在链接时从A编译单元的目标文件中找到该定义
全局变量(extern)
有两个类都需要使用共同的变量,这种变量就定义为全局变量。一般在头文件中声明,在cpp中定义,定义只能出现一次
静态全局变量(static)
使用static修饰的变量,不能用extern修饰。
static修饰的全局变量的声明与定义同时进行,即当你在头文件中是使用static声明了全局变量,同时也别定义了,
static修饰的全局变量的作用域只能是本身的编译单元内,不同编译单元的同名全局静态变量是没有关联的,占用的物理空间也是完全独立的
全局静态变量一般定义在.cpp中
全局常量(const)
const单独使用时,其特性与static一样(每个编译单元中地址都不一样,不过因为是常量,也不能修改,所以就没有多大关系)
const与extern一起使用时,其特性与extern一样,但不能修改