几个关键字作用:
1)auto
这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。
(2)register
这个关键字命令编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。
这个关键字主要有以下两个作用:
1、改变变量的生存周期
void fun (void)
{
static int flag = 0;
flag++;
}
注:这个flag定义为静态int型变量,在内存中的存储位置为静态区,初始化为0,并且第一次初始化以后再次调用fun函数不会再初始化。它的生存周期不会随着fun函数的消亡而消失,只有当整个程序结束才消失,也可以认为是main函数结束后才消亡。
2、改变函数或者变量等的作用域
这里我就简单用文字描述,当我们在做一个项目的时候,两个程序员一个写了1.c,另外一个写了2.c。他们都定义了全局变量flag或者全局函数fun等,当这个项目链接两个文件的时候,编译器就会报错为重复定义,这时就需要在函数前面加static关键字,使它的作用域改变为只在当前文件中可见。不可在其他文件中用extern访问。
(4)const
被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。它可以修饰函数的参数、返回值,甚至函数的定义体。
例如:strcat(char *dest, const char *src):这个函数是链接两个字符串,让后面字符串src链接到前面dest字符串后面,我们可以改变字符串dest,但是不可改变src,所以在后面的参数中嫁了const,让其不可被函数改变,如果改变了编译器会提示你修改了一个const变量。
(5)volatile
表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。它可以适用于基础类型如:int,char,long......也适用于C的结构和C++的类。当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员都会被视为volatile.
该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程。
例如:
int i = 5;
printf("%d_%d\n", i++, ++i); 这个输出表达式如果是按照我们想的,从从右到左结合,应该是输出6_6,但是这里输出的是 6_7,这就是编译器给我们优化了。
如果在定义 i的时候前加了volatile
volatile int i = 5;这时就会按照我们的要求去运算,结果为6_6,编译器不会去优化,会去慎重的取i的值。
(6)extern
extern 意为“外来的”···它的作用在于告诉编译器:有这个变量,它可能不存在当前的文件中,但它肯定要存在于工程中的某一个源文件中或者一个Dll的输出中
作用是:
调用其他文件的中函数或者变量,其他文件中如果没有我们需要的函数或者变量的话会报ld错误,文件链接错误。