储存类定义c程序中变量或函数的可见性范围和生命周期。放置于所修饰的类型之前。可用的存储类:
auto
auto存储类是所有局部变量默认的存储类。
{
int mount;
auto int mount;
}
上面实例定义了两个带有相同存储类的变量。
注意:auto只能用在函数内,即auto只能修饰局部变量。
register
register存储类用于定义存储在寄存器中而不是RAM中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对应用一元的`&`运算符(因为它没有内存位置)。
{
register int miles;
}
寄存器只能用于需要快速访问的变量,比如计数器。且定义`register`并不意味着变量被存储在寄存器中,这取决于硬件和实现的限制。
static
static存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次进入和离开局部变量的作用域时进行创建和销毁。因此,使用static修饰局部变量可以在函数调用之间保持局部变量的值。
static修饰符也可以用于全局变量。当static修饰全局变量时,会使全局变量的作用域限制在声明它的文件内。
在c编程中,当static用在类数据成员上时,会导致仅有一个该成员的副本被类的所有对象共享。
#include<stdio.h>
void func(void); //函数声明
static int count = 6; //全局变量声明
int main()
{
while (count--)
func(); //函数调用
return 0;
}
void func(void) //函数声明
{
static int i = 5;
i++;
printf("i is %d and count is %d \n", i, count);
}
编译和执行结果:
i is 6 and count is 5
i is 7 and count is 4
i is 8 and count is 3
i is 9 and count is 2
i is 10 and count is 1
i is 11 and count is 0
extern
extern存储符用于一个全局变量的引用,全局变量对所有的程序文件都是可见的。使用extern时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置,
当有多个文件,且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用extern来得到已定义的的变量或函数的引用。可以这么理解,extern是用来在例外一个文件中声明一个全局变量或函数。
extern修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候,如下所示:
第一个文件:main.c
#include<stdio.h>
int count; //全局变量声明
extern void write_extern(); //函数原型
int main()
{
count = 5;
write_extern(); //函数调用
return 0;
}
第二个文件:support.c
#include<stdio.h>
extern int count;
void write_extern(void) //函数声明
{
printf("count is %d\n", count);
}
第二个文件中几extern用于声明已经在第一个文件main.c中定义的count。编译两个文件(命令符中输入:gcc hello.c support.c),如下所示:
count is 5