1.extern的作用
extern关键字可以用来声明变量和函数作为外部变量或者函数供其它文件使用。
extern “C” extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。
因为在C++出现以前,很多代码都是C语言写的,而且很底层的库也是C语言写的,为了更好的支持原来的C代码和已经写好的C语言库,需要在C++中尽可能的支持C,而extern "C"就是其中的一个策略。
2.static关键字作用
-
static修饰局部变量 (1)静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。 -
static修饰全局变量 (1)全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化。 (2)普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用。也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。 (3)静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。 -
static修饰普通函数 函数的使用方式与全局变量类似,在函数的返回类型前加上static,就是静态函数。其特性如下: (1)静态函数只能在声明它的文件中可见,其他文件不能引用该函数 (2)不同的文件可以使用相同名字的静态函数,互不影响 -
static修饰成员变量 在类内数据成员的声明前加上static关键字,该数据成员就是类内的静态数据成员。其特点如下: (1)静态数据成员存储在全局数据区,静态数据成员在定义时分配存储空间,所以不能在类声明中定义 (2)静态数据成员是类的成员,无论定义了多少个类的对象,静态数据成员的拷贝只有一个,且对该类的所有对象可见。也就是说任一对象都可以对静态数据成员进行操作。而对于非静态数据成员,每个对象都有自己的一份拷贝。 (3)由于上面的原因,静态数据成员不属于任何对象,在没有类的实例时其作用域就可见,在没有任何对象时,就可以进行操作 和普通数据成员一样,静态数据成员也遵从public, protected, private访问规则 (4)静态数据成员的初始化格式:<数据类型><类名>::<静态数据成员名>=<值> (5)类的静态数据成员有两种访问方式:<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名> 同全局变量相比,使用静态数据成员有两个优势: (1)静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性 (2)可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能 -
static修饰成员函数 (1)与静态数据成员类似,静态成员函数属于整个类,而不是某一个对象,其特性如下: (2)静态成员函数没有this指针,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数 出现在类体外的函数定义不能指定关键字static 非静态成员函数可以任意地访问静态成员函数和静态数据成员
3.volatile作用?
volatile int i=10;
int a = i;
...
// 其他代码,并未明确告诉编译器,对 i 进行过操作
int b = i;
volatile 指出 i 是随时可能发生变化的,每次使用它的时候必须从 i的地址中读取,因而编译器生成的汇编代码会重新从i的地址读取数据放在 b 中。而优化做法是,由于编译器发现两次从 i读数据的代码之间的代码没有对 i 进行过操作,它会自动把上次读的数据放在 b 中。而不是重新从 i 里面读。这样以来,如果 i是一个寄存器变量或者表示一个端口数据就容易出错,所以说 volatile 可以保证对特殊地址的稳定访问。
(1)访问寄存器要比访问内存要快,因此CPU会优先访问该数据在寄存器中的存储器结果,但是内存中的数据可能已经发生改变了,而寄存器中还保留着原来的结果。为了避免这种情况的发生将该变量声明为volatile ,告诉CPU每次都去内存去读取数据。
(2)一个参数既可以是const又可以是volatile 么?–可以,比如只读状态寄存器,
4.const的作用
|