- auto:指定为自动变量,由编译器自动分配及释放。通常在栈上分配
- static:指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部
- register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数
- extern:指定对应变量为外部变量,即在另外的目标文件中定义,可以认为是约定由另外文件声明的对象的一个“引用“
- const:与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变)
- volatile:与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值
目录
1. auto
用于声明自动存储变量。它是默认的存储类别,可以省略不写。`auto`关键字声明的变量在函数内部具有自动存储期和块作用域。这意味着变量在声明它的块结束时被销毁,并且在该块的内部可见。例如:
void foo() {
auto int i = 0; // auto 关键字可以省略
}
2. static
有不同的用途。在全局作用域内的变量声明中使用`static`关键字,可以将其作用域限制在当前源文件中,该变量在整个程序执行期间都存在,但只能通过该文件内的代码访问。在局部作用域内的变量声明中使用`static`关键字,可以使变量在函数调用之间保持持久性,即变量的值在函数调用时不会被重置,并且该变量只能在声明函数内部的作用域中访问。例如:
static int globalVar; // 静态全局变量
void foo() {
static int count; // 静态局部变量
}
3. register
用于建议编译器将局部变量存储在寄存器中,以便更快的访问速度。然而,这只是一个建议,并不一定会被编译器采纳。现代编译器已经足够智能,在需要时会自动选择是否将变量存储在寄存器中,因此在实际编程中很少使用`register`关键字。
4. extern
关键字用于声明在其他源文件或模块中定义的全局变量或函数。它表示该变量或函数是在其他地方定义的,而不是当前文件中定义的。它用于在一个源文件中引用另一个源文件中的全局变量或函数。例如:
extern int globalVar; // 声明全局变量
extern void foo(); // 声明函数
5. const
用于声明常量,表示变量的值不可更改。一旦变量被声明为`const`,不能再修改它的值。`const`关键字还可以用于修饰函数的参数,表示函数在执行期间不会修改参数的值。例如:
const int MAX_VALUE = 100; // 常量
void foo(const int num); // 声明一个不可修改的形参
6. volatile
用于告知编译器该变量的值可能以意想不到的方式被更改,例如被硬件或多线程环境中的其他线程修改。这样的变量不会被编译器优化,每次访问时都会从内存中读取它的最新值。例如:
volatile int status; // 声明一个易变变量
联系和区别:
1. `auto`、`static`和`register`关键字用于修饰存储类别和作用域,它们影响变量的声明方式和生命周期。
2. `extern`关键字用于声明在其他源文件中定义的全局变量或函数,它用于在一个源文件中引用另一个源文件中的实体。
3. `const`关键字用于声明常量,表示变量的值不可更改。
4. `volatile`关键字用于标记易变变量,它告知编译器该变量可能以意外的方式改变,以防止编译器对该变量的优化。
总结:
- `auto`关键字用于声明自动存储变量,它是默认的存储类别。
- `static`关键字用于限制变量的作用域或延长变量的生命周期。
- `register`关键字指示编译器将变量存储在寄存器中,但现代编译器已经智能地处理这个问题。
- `extern`关键字用于声明在其他源文件中定义的全局变量或函数。
- `const`关键字用于定义常量,表示其值不能被修改。
- `volatile`关键字用于标记变量可能以意外的方式被改变,例如通过硬件或多线程环境中的其他线程。这样的变量不会受到编译器的优化,每次访问时都会从内存中读取最新的值。它常用于访问硬件寄存器或多线程编程中。
这些关键字的使用是根据实际需要来决定的。在一般情况下,`auto`和`register`关键字很少使用,因为编译器已经能够智能地处理变量的存储和访问方式。`static`关键字常用于限制变量的作用域或延长变量的生命周期。`extern`关键字用于在不同的源文件中共享全局变量或函数。`const`关键字用于声明常量,以防止其值被修改。`volatile`关键字用于标记易变变量,以确保每次访问时都从内存中读取最新的值。