
1)自动
此关键字用于声明变量的生存期是自动的,即,未在任何类,结构,枚举,联合和函数中定义的变量被视为全局变量,而在函数中定义的变量被视为局部变量变量. 这个关键字写得不多,因为默认情况下所有变量都是自动的.
(2)注册
此关键字指示编译器将变量尽可能多地存储在CPU内部寄存器中,而不是通过内存寻址进行访问以提高效率.
(3)静态
两个常见用途:
1>调用统计函数的次数;
2>减少本地数组创建和分配的开销. 变量的创建和分配需要一定数量的处理器开销,尤其是包含更多元素(例如数组)的存储类型. 在某些包含许多变量且经常调用的函数中,可以将某些数组声明为静态类型,以减少创建或初始化这些变量的成本.
详细说明:
1>,该变量将被放置在程序的全局存储区中,以便在下次调用时可以保留原始分配. 这就是堆栈变量和堆变量之间的区别.
2>变量使用静态变量通知编译器它们仅在变量范围内可见. 这是它和全局变量之间的区别.
3>当使用static修改全局变量时,它将更改全局变量的范围,以便它不能被其他程序外部使用,并被限制在当前文件中,但不会更改其存储位置. 静态存储区.
使用说明:
1>如果仅在单个C文件中访问全局变量,则可以将此变量修改为静态全局变量,以减少模块之间的耦合;

2>如果仅通过单个函数访问全局变量,则可以将此变量更改为函数的静态局部变量,以减少模块之间的耦合;
3>在设计和使用访问动态全局变量,静态全局变量和静态局部变量的函数时,需要考虑重入问题(只要输入数据相同,就应产生相同的输出).
(4)const
由const修改的内容受到强制保护,可以防止意外更改并提高程序的健壮性. 它可以修改函数参数c 类 static 函数,返回值,甚至函数定义的主体.
功能:
1>修改输入参数
a. 对于非内部数据类型的输入参数,应将“值传递”的方法更改为“常量参考传递”,以提高效率. 例如,将void Func(A a)更改为void Func(const A&a).
b. 对于内部数据类型的输入参数,请勿将“值传递”方法更改为“常量引用传递”. 否则,达不到提高效率的目的,并且功能的清晰度降低. 例如,不应将void Func(int x)更改为void Func(const int&x).
2>用const修改函数的返回值
a. 如果在“指针传递”模式下向函数返回值添加const修饰符,则不能修改函数返回值(即指针)的内容,并且只能将返回值分配给指针的指针. 具有const修改的相同类型.
例如: const char * GetString(void);
以下语句中将发生编译错误:
char * str = GetString(); //无法从'const char *'转换为'char *';
正确的用法是:

const char * str = GetString();
b. 如果函数返回值采用“值传递方法”,则由于该函数会将返回值复制到外部临时存储单元c 类 static 函数,因此添加const修改将没有值. 例如,请勿将函数int GetInt(void)编写为const int GetInt(void).
3>在const成员函数的声明中,只能将const关键字放在函数声明的末尾,指示此类的成员不会修改该对象.
说明:
const类型m; //将m修改为不可更改
示例:
typedef char * pStr; //新型pStr;
字符字符串[4] =“ abc”;
const char * p1 =字符串;
p1 ++; //是的,上面的修改是* p1,p1变量
const pStr p2 =字符串;
p2 ++; //错误,上面的修改是p2,p2不是变量,* p2是变量
类似地,当使用const修改指针时,不会被该原理所混淆.
const int *值; // *值是不变的,值是可变的

int *常量值; //值不可变,*值不可变
const(int *)值; //(int *)是一种类型,值是不可变的,*值是可变的
//从逻辑上理解编译无法通过,并且tydef int * NewType;
const int *常量值; // *值,值不可更改
(5)易挥发
表示变量的值可以在外部更改. 优化器每次使用此变量时都必须仔细重新读取此变量的值,而不是使用保存在寄存器中的备份. 它可以应用于基本类型,例如: int,char,long ...,还可以应用于C结构和C ++类. 在结构或类对象上使用易失性修饰时,该结构或类的所有成员都将被视为易失性.
该关键字通常在多线程环境中使用,因为在编写多线程程序时,同一变量可能会被多个线程修改,并且程序会通过该变量同步每个线程.
简单的例子:
DWORD __stdcall threadFunc(LPVOID信号)
{
int * intSignal = reinterpret_cast(信号);
* intSignal = 2;
同时(* intSignal!= 1)
睡眠(1000);

返回0;
}
当线程启动时,将intSignal设置为2,然后循环等待直到intSignal为1退出. 显然,必须从外部更改intSignal的值,否则该线程将不会退出. 但是,即使在外部将其值更改为1,该线程在实际运行时也不会退出,通过查看相应的伪汇编代码可以清楚地看到该线程:
移动斧头,信号
标签:
如果(ax!= 1)
转到标签
对于C编译器,它不知道此值将被其他线程修改. 自然地将其缓存在寄存器中. C编译器没有线程的概念,这一次您需要使用volatile. volatile的原始含义是: 可以在当前线程之外更改此值. 换句话说,我们需要在threadFunc的intSignal前面添加volatile关键字. 此时,编译器知道该变量的值将在外部更改,因此每次访问该变量时都会再次读取该变量,并且循环变为如下伪代码所示:
标签:
移动斧头,信号
如果(ax!= 1)
转到标签
注意: 参数可以是const和volatile,也可以是volatile,因为它可能会意外更改. 之所以为const,是因为该程序不应尝试对其进行修改.
(6)外部
extern的意思是“外来”……其目的是告诉编译器: 使用此变量,它可能不存在于当前文件中,但必须存在于源文件或项目Dll输出中的文件中.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-209741-1.html
很有感情加油
就是以鬼城为平台
平身