overlay/static/register/atuo/extern/volatile/const 修饰符的用法
static
l 静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可改变其值。
l 静态变量或静态函数,即只有本文件内的代码才可访问它,它的名字(变量名或函数名)在其它文件中不可见。
l 在函数体内生成的静态变量它的值也只能维持
int max_so_far( int curr )
//求至今(本次调用)为止最大值
{
static int biggest;
//该变量保持着每次调用时的最新值,它的有效期等于整个程序的有效期
if( curr > biggest )
biggest = curr;
return biggest;
}
l 在C++类的成员变量被声明为static(称为静态成员变量),意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;而类的静态成员函数也只能访问静态成员(变量或函数)。
l 类的静态成员变量必须在声明它的文件范围内进行初始化才能使用,private类型的也不例外。如,
float SavingsAccount::currentRate = 0.00154;
(注:currentRate是类SavingsAccount的静态成员变量)
register
l 用register声明的变量称着寄存器变量,在可能的情况下会直接存放在机器的寄存器中;但对32位编译器不起作用,当global optimizations(全局优化)开的时候,它会做出选择是否放在自己的寄存器中;不过其它与register关键字有关的其它符号都对32位编译器有效。
auto
l 它是存储类型标识符,表明变量(自动)具有本地范围,块范围的变量声明(如for循环体内的变量声明)默认为auto存储类型。
extern
l 声明变量或函数为外部链接,即该变量或函数名在其它文件中可见。被其修饰的变量(外部变量)是静态分配空间的,即程序开始时分配,结束时释放。用其声明的变量或函数应该在别的文件或同一文件的其它地方定义(实现)。在文件内声明一个变量或函数默认为可被外部使用。
l 在C++中,还可用来指定使用另一语言进行链接,这时需要与特定的转换符一起使用。目前Microsoft C/C++仅支持”C”转换标记,来支持C编译器链接。使用这种情况有两种形式:
u extern “C” 声明语句
u extern “C” { 声明语句块 }
volatile
l 限定一个对象可被外部进程(操作系统、硬件或并发线程等)改变,声明时的语法如下:
int volatile nVint;
这样的声明是不能达到最高效的,因为它们的值随时会改变,系统在需要时会经常读写这个对象的值。
只常用于像中断处理程序之类的异步进程进行内存单元访问。
const
l const所修饰的对象或变量不能被改变,修饰函数时,该函数不能改变在该函数外面声明的变量也不能调用任何非const函数。在函数的声明与定义时都要加上const,放在函数参数列表的最后一个括号后。
l 在C++中,用const声明一个变量,意味着该变量就是一个带类型的常量,可以代替#define,且比#define多一个类型信息,且它执行内链接,可放在头文件中声明;但在C中,其声明则必须放在源文件(即.C文件)中,在C中const声明一个变量,除了不能改变其值外,它仍是一具变量,如
const int maxarray = 255;
char store_char[maxarray];
//C++中合法,C中不合法
l const修饰指针时要特别注意。例:
char *const aptr = mybuf;
// 常量指针
*aptr = 'a'; // Legal
aptr = yourbuf; // Error
const char *bptr = mybuf;
// (指针bptr)指向常量数据
*bptr = 'a'; // Error
bptr = yourbuf; // Legal
l const修饰成员函数时不能用于构造和析构函数。
volatile 表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。它可以适用于基础类型如:int,char,long......也适用于C的结构和C++的类。当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员都会被视为volatile. 该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程。 简单示例: DWORD __stdcall threadFunc(LPVOID signal) { int* intSignal=reinterpret_cast(signal); *intSignal=2; while(*intSignal!=1) sleep(1000); return 0; } 该线程启动时将intSignal 置为2,然后循环等待直到intSignal 为1 时退出。显然intSignal的值必须在外部被改变,否则该线程不会退出。但是实际运行的时候该线程却不会退出,即使在外部将它的值改为1,看一下对应的伪汇编代码就明白了: mov ax,signal label: if(ax!=1) goto label 对于C编译器来说,它并不知道这个值会被其他线程修改。自然就把它cache在寄存器里面。C 编译器是没有线程概念的,这时候就需要用到volatile。volatile 的本意是指:这个值可能会在当前线程外部被改变。也就是说,我们要在threadFunc中的intSignal前面加上volatile关键字,这时候,编译器知道该变量的值会在外部改变,因此每次访问该变量时会重新读取,所作的循环变为如下面伪码所示: label: mov ax,signal if(ax!=1) goto label 注意:一个参数既可以是const同时是volatile,是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
overlay/static/register/atuo/extern/volatile/const 修饰符的用法相关推荐
- const修饰符的用法总结
一.const常量 在 C++ 中,有两种简单的定义常量的方式: 1.使用 #define 预处理器. #define LENGTH 10 #define WIDTH 5 #define NEWLIN ...
- 我对const修饰符应用的理解
先说说我对编译器对const处理的理解:const修饰符定义一个常量,const变量在整个程序中只有一个拷贝.编译器会跟踪所有用到这个常量的地方,一旦发现任何一个操作可能会改变这个它是常量这个属性,那 ...
- C++ const修饰符和指针
C++ const修饰符和指针 开发工具与关键技术:C++.VisualStudio 作者:何任贤 撰写时间:2019年04月10日 const修饰符,是用来修饰变量,被const修饰符,修饰过的变量 ...
- C语言-指针-基础用法、运算、指针与数组、指针数组、多级指针、void指针和const修饰符-学习笔记08
文章目录 1. 地址和变量 2. 指针 2.1 基本声明 2.2 指针的目标 3. 指针的运算 3.1 指针的赋值运算 3.2 指针的算术运算 3.2.1 指针与常量的加法与减法 3.2.2 两指针相 ...
- [Reprint]C++函数前和函数后加const修饰符区别
c++中关于const的用法有很多,const既可以修饰变量,也可以函数,不同的环境下,是有不同的含义.今天来讲讲const加在函数前和函数后面的区别.比如: 01 #include<iostr ...
- Java并发编程(5):volatile变量修饰符—意料之外的问题(含代码)
volatile用处说明 在JDK1.2之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的.而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用 ...
- C++成员函数中的const修饰符
在一些C++源码中经常见到const修饰的函数,这里的const与放的位置无关,也就是下面三种写法是等效的,只不过通常使用第一种写法,可以编写函数进行测试,这里的const虽然写在了函数的位置,其实是 ...
- C语言中extern修饰符的用法
在C语言中,修饰符extern用在变量或者函数的声明前,用来说明"此变量/函数是在别处定义的,要在此处引用". 0. extern修饰变量的声明.举例来说,如果文件a.c需要引用b ...
- re模块常用修饰符_在c语言中修饰符的用法
展开全部 const 首先需要注意的是,const修饰的是在62616964757a686964616fe4b893e5b19e31333337396234它前面的类型,如果它前面没有类型,那它修 饰 ...
- C++ const 修饰符
C++ const 实施保护 概述 常对象 常对象成员 常成员函数 常数据成员 数据成员访问限制 常对象修改的限制 常指针 指向常变量的指针 指向对象的指针 小结 对象的常引用 总结 概述 const ...
最新文章
- python 下划线转驼峰
- AI一分钟 | 张亚勤:保护用户数据安全是百度的第一原则;美国开通全球首条高速自动驾驶测试路...
- 向textarea元素输入限制长度的字符
- ajax联系人数,setInterval定时调用ajax实现在线人数统计
- 用GCD来处理大量for loop任务
- 全国计算机等级考试题库二级C操作题100套(第92套)
- Java里面static, final, this, super, 代码块, 单例模式
- Python实例 63,64
- make pycaffe 报错:“fatal error: numpy/arrayobject.h: No such file or directory” 解决方案
- Guns 旗舰版2.1发布,更新树形表格
- PHP5.5+Nginx1.9
- 语言阿克曼函数_函数式的动态规划
- iOS6和iOS7适应代码(6) —— NSLocalizedString
- IIS 常见异常及解决办法
- 自动驾驶_感知_目标检测(基于图像)
- java 性能框架_Java Fork Join 框架(四)性能
- shiny datatable child row:shiny表格二级子行的展开与折叠
- CPU纯软件全虚拟化技术
- MTK功能机ATA导入
- Python解释大数定律
热门文章
- 语文音乐计算机的英语怎么读,音乐英语怎么读
- js中函数传参的问题
- 角度和弧度之间的转换
- 二元一次方程编程解鸡兔同笼问题
- win10计算机域填写,win10系统如何加入域 win10系统加入域的方法
- win10计算机域填写,win10如何加入域_windows10域如何创建
- 设计模式(一) 简单工厂模式
- android 手机格式验证,android – 使用国家/地区代码验证手机号码
- 7款颜值当道的 Linux 操作系统 !
- 表格怎么样输入数字自己计算机,如何让EXCEL中输入数字后自动显示求和结果