C/C++的关键字
文章目录
1 static关键字
- 在函数体内,被声明为静态的变量只初始化一次,以后该函数再被调用,将不会再初始化。
- 在模块内(但在函数体外),如果把一个变量或者函数声明为静态的,那么可以将其作用域被限制在本模块内,起一个“隐藏”的作用,避免命名冲突。
- 默认初始化为0,因为静态变量存储在静态数据区,而静态数据区中的所有字节默认值都是0x00。
- 在C++中,在类中声明static变量或者函数。其初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。
2 const关键字
- 定义常量,使其值不可被修改,且编译器可以对其进行类型检查。
- 修饰函数形参,防止其值被意外修改,提高程序健壮性。
- 修饰常量指针
const char * p
和指针常量char * const p
。 - 修饰函数返回值。
- 在C++中,修饰类成员函数,任何不会修改数据成员的函数都应该用const修改。以及修饰类成员数据。
3 volatile关键字
volatile是一个类型修饰符,被其修饰的变量,编译器不会对其进行优化。所以每次用到它的时候都是直接从对应的内存当中提取,而不会利用cache(缓存)或寄存器中的原有数值。一般用来修饰多线程间被多个任务共享的变量和并行设备硬件寄存器等。
4 sizeof关键字
4.5 结构体大小
结构体有时候需要字节对齐。一般而言,struct的sizeof是所有成员字节对齐后长度相加,而union的sizeof是取最大的成员长度。
可以通过下面的方法来改变默认的对界条件:
-
使用伪指令#pragma pack(n),C编译器将按照n个字节对齐。
-
使用伪指令#pragma pack(),取消自定义字节对齐方式。
字节对齐遵循两条原则:
结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)。
结构体大小必须是所有成员大小的整数倍。
#pragma pack(2)
typedef struct{
char c;
int i;
}str;
//sizeof(str)的值为6;
//若取消自定义对齐,则sizeof(str)值为8;
zeof(str)的值为6;
//若取消自定义对齐,则sizeof(str)值为8;