关键字static、const、volatile的作用

关键字static的作用是什么?
这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:
1、在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2、 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3、在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,但是很少的人能懂得第三部分。做为一个合格的软件工程师,我们要懂得第三部分的作用,要懂得本地化数据和代码范围的好处和重要性。

int testStatic()
{
 int x=1;
 x++;
 return x;
}
main()
{
 int i;
 for(i=0;i<5;i++)
 printf("%d/n",testStatic());
}

输出为:

2

2

2

2

2

 

int testStatic()
{
 static  int x=1;
 x++;
 return x;
}
main()
{
 int i;
 for(i=0;i<5;i++)
 printf("%d/n",testStatic());
}

输出为:

2

3

4

5

6

const 有什么用途?

1)可以定义 const 常量

2const可以修饰函数的参数、返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
  const意味着"只读"。区别如下代码的功能非常重要。

 

const int a;
int const a;
const int *a;
int * const a;
int const * a const;

 

  • 前两个作用是一样的,a是一个常整型数。
  • 第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
  • 第四个意思是a是一个指向整型数的常指针(也就是,指针指向的整型数是可以修改的,但指针是不可修改的)。
  • 最后一个意味着a是一个指向常整型数的常指针(也就是,指针指向的整型数是不可修改的,同时指针也是不可修改的)。


  (1)关键字const的作用是为给读你代码的人传达非常有用的信息。例如,在函数的形参前添加const关键字意味着这个参数在函数体内不会被修改,属于"输入参数"。在有多个形参的时候,函数的调用者可以凭借参数前是否有const关键字,清晰的辨别哪些是输入参数,哪些是可能的输出参数。

  (2)合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改,这样可以减少bug的出现。

  const在C++语言中则包含了更丰富的含义,而在C语言中仅意味着:"只能读的普通变量",可以称其为"不能改变的变量"(这个说法似乎很拗口,但却最准确的表达了C语言中const的本质),在编译阶段需要的常数仍然只能以#define宏定义!故在C语言中如下程序是非法的:

const int SIZE = 10;
char a[SIZE]; /* 非法:编译阶段不能用到变量 */

 

以下是工作中的使用const例子:

const unsigned char *  pbyData;

unsigned char const DayPerMonth[12] = { 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31 } ;

extern void dp_write_dsp_block ( const word *bp, word len );

const unsigned short  cnstUni2InterMapSparseIdx[];

 

 

volatile问题:

volatile的语法与const是一样的,但是volatile的意思是“在编译器认识的范围外,这个数据可以被改变”。不知何故,环境正在改变数据(可能通过多任务处理),所以,volatile告诉编译器不要擅自作出有关数据的任何假设——在优化起家这是特别重要的。如果编译器说:“我已经吧数据读入寄存器,而且在没有与寄存器接触。”在一般情况下,它不需要再读入这个数据。但是,如果数据是volatile修饰的,编译器则是不能做出这样的假定,因为数据可能被其他进程改变了,编译器必须重新读这个数据而不是优化这个代码。就像建立const对象一样,程序员也可以建立volatile对象,甚至还建立const volatile对象。这个对象不能被程序员改变,但可通过外面的工具改变。

    volatile对象每次被访问时必须重新读取这个变量的值,而不是用保存在寄存器中的备份。下面时volatile变量的几个例子:

    .并行设备的硬件寄存器(如状态寄存器);

    .一个中断服务子程序中会访问到的非自动变量(Non-automatic variables);

    .多现成应用中被几个任务共享的变量。

一个参数可以const同时也是volatile,一个指针也是可以为volatile的,但是具体编程时要小心,要保证不被意外修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435693.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IE8中解决Cell华表插件不显示方法!

最近一不小心更新了IE&#xff0c;从IE7一跃变成了IE8用户&#xff0c;但网上目前对IE8的评价不是很好&#xff0c;有很多东西不兼容&#xff0c;尤其是在IE7下开发的系统不兼容的地方还是存在的。就Cell来说也是一样的&#xff0c;调试好久&#xff0c;虽然没找到原回&#xf…

【转】CMake Error: The current CMakeCache.txt directory CMakeCache.txt is different than the directory

转自&#xff1a;CMake Error: The current CMakeCache.txt directory is different..._万俟淋曦的进击手记-CSDN博客 零、问题描述 开始学ROS时&#xff0c;需要编译别人的功能包&#xff0c;常常把别人的工作空间拿过来使用&#xff0c;但编译时会出现各种错误&#xff0c;如…

WinCE 5.0 WIFI 无线网卡的配置和建立连接(转)

From&#xff1a;http://blog.csdn.net/xajhuang/archive/2008/12/02/3419512.aspx 在 Windows CE 下自带有无线网卡的配置和连接程序&#xff0c;可是我的系统剪裁掉了资源管理器和任务栏&#xff0c;导致自带的无线网卡配置程序不能再使用了&#xff0c;只好自力更生。 我的…

【转】Qt所有的类

转自&#xff1a;Qt所有的类 - IT观察者 - 博客园 QAccel处理键盘加速器和快捷键Handles keyboard accelerator and shortcut keysQAccessibleEnums与可达性的静态函数Enums and static functions relating to accessibilityQAccessibleInterface定义一个接口&#xff0c;该接…

异步调用与多线程

异步调用并不是要减少线程的开销, 它的主要目的是让调用方法的主线程不需要同步等待在这个函数调用上, 从而可以让主线程继续执行它下面的代码.与此同时, 系统会通过从ThreadPool中取一个线程来执行,帮助我们将我们要写/读的数据发送到网卡.由于不需要我们等待, 我们等于同时做…

【转】DPDK(一):专业术语

转自&#xff1a;DPDK&#xff08;一&#xff09;&#xff1a;专业术语 - 小蚂蚁_CYJ - 博客园 一&#xff1a;简介 1、术语 EAL&#xff1a;Environment Abstraction Layer LPM&#xff1a;Longest Prefix Match IOVA-contiguous&#xff1a; VFIO&#xff1a;VFIO是一个可以…

wince2秒快速启动TOC分析

为什么29M的wince内核nk.nb0文件在2秒钟就能快速启动&#xff0c;如果你用汇编设计一个从NAND单纯拷贝29M nk.nb0的快速程序&#xff0c;你会发现用200MFCLK的2410或者用400MFCLK的2440都至少需要十几秒&#xff0c;那为什么ce能够启动这么快呢&#xff0c;有什么加速算法吗&am…

插座上的Linux充电器.不..Marvell Plug Computer

一直以来&#xff0c;台式机都有变小的趋势&#xff0c;于是变成了一体机&#xff0c;主机也有变小的趋势&#xff0c;那样可以占用更小的空间&#xff0c;却提供一样的功 能&#xff0c;Marvell Plug Computer 3.0 同样是那种壁插式主机&#xff0c;身形小巧&#xff0c;能够直…

【转】tftp命令详解

转自&#xff1a;tftp命令详解 - 张大猛 - 博客园 介绍一个 FTP客户端-IIS7服务器管理工具 作为FTP客户端&#xff0c;它支持批量管理ftp站点。定时上传和定时下载&#xff0c;定时备份&#xff0c;且操作简洁。同时iis7服务器管理工具还是vnc客户端。并且支持批量管理管理…

对Multi-bin 技术的理解

[bin文件的格式]&#xff1a; Bin文件格式比较简单.结构如下&#xff1a; struct BinFile { BYTE signature[7]; //前面7个字节是标志, 固定的{‘B’,‘0’,‘0’,‘0’,‘F’,‘F’,‘\a’}. DWORD ImageStart; //Image Start表示image的开始地址 DWORD ImageLength; …

关于C#程序调用AMFPHP服务的问题!!

我想实现的功能是实现一个c# winform客户端&#xff08;web也行&#xff09;&#xff0c;与php服务器以amf3格式通信&#xff0c;其实就是模拟flex与php通信的机制&#xff0c;这方面资料真的太少了&#xff0c;不知道该怎么实现&#xff0c;求帮助&#xff0c;谢谢&#xff01…

【转】总结_C++日志系统log4cxx使用

转自&#xff1a;总结_C日志系统log4cxx使用_OneByOne-CSDN博客_log4cxx C日志系统log4cxx使用总结 参考连接: log4CXX第二篇---配置文件&#xff08;properties文件&#xff09;详解_crazyhacking的专栏-CSDN博客 C日志系统log4cxx使用总结_邵明_新浪博客 一、log4cxx组件…

S3c2440A平台HIVE注册表+binfs的实现

我的例子是基于samsung S3C2440A&#xff0b;samsung ONENANDWinCE5.0的&#xff0c;开发平台是platform builder 5.0&#xff0c;首先我们基于RAM register的image已经可以正常跑起来了&#xff0c;Flash除了放置image外其他的空间为用户提供文件系统&#xff0c;这部分的驱动…

DHT

DHT 类似Tracker的根据种子特征码返回种子信息的网络.DHT全称叫分布式哈希表(Distributed Hash Table)&#xff0c;是一种分布式存储方法。在不需要服务器的情况下&#xff0c;每个客户端负责一个小范围的路由&#xff0c;并负责存储一小部分数据&#xff0c;从而实现整个DHT网…

【转】日志记录库(log4cxx)使用指南

转自&#xff1a;日志记录库&#xff08;log4cxx&#xff09;使用指南_外环西路-CSDN博客 一、Log4j、log4cxx简介 Log4j、log4cxx有三个主要的组件&#xff1a; Loggers(记录器)&#xff0c;Appenders (输出源)和Layouts(布局)。Loggers(记录器)&#xff1a; 负责执行记录日…

WinCE5.0 SMDK2410 BSP在GEC2410开发板上的移植(11)-BINFS在Nand上的实现(Multi-Bin的实现)

之前我们都是把整个系统镜像复制到RAM中运行,这样启动时间较慢,也占用内存.使用Multi-Bin的模式,将需要复制到RAM的组件和可存放在存储设备(如Nand)中的组件分开,系统启动时只需要将CE核心组件复制到内存中运行,然后需要的组件从Nand中读取即可.之前我们已经在eboot中添加了操作…

C# 数据库连接字符串集合

c#数据库连接字符串集合(一)常用连接:1.使用SqlConnection对象: a. Sql 验证public void SqlConnectionOpen(){SqlConnection conn new SqlConnection();conn.ConnectionString "user idsa;password;initial catalognorthwind;datasourcelocalhost;connect Timeout20&quo…

【转】聊聊Linux操作系统中的显示管理器及如何更换

转自&#xff1a;聊聊Linux操作系统中的显示管理器及如何更换 - linux-123 - 博客园 聊聊Linux操作系统中的显示管理器及如何更换 | 《Linux就该这么学》 什么是 Linux 中的显示管理器&#xff1f; 简单来说&#xff0c;显示管理器display manager&#xff08;DM&#xff09…

winCE改变字库方法(WINCE字库更新)

更新系统字库&#xff1a;例如要在WinCE5.0加入微软雅黑字体的支持。 第一步&#xff1a;增加如下注册表 [HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/FontPath] "FontPath""// Windows " ; 字库文件所在目录 [HKEY_LOCAL_MACHINE/SYSTEM/GDI] "Fon…

【转】[WSL2]WSL2迁移虚拟磁盘文件ext4.vhdx

转自&#xff1a;[WSL2]WSL2迁移虚拟磁盘文件ext4.vhdx_Ryan ZHENG的专栏-CSDN博客 WSL2本质上是一个虚拟机&#xff0c;因此必然存在磁盘镜像文件。 默认情况下&#xff0c;这个镜像文件会放在C盘&#xff08;参考官网举例&#xff1a;%LOCALAPPDATA%\Packages<PackageFa…