c语言 关键字之volatile extern详解

Volatile 

 在C语言中,还有一个并不经常使用但却非常有用的关键字volatile。那么使用volatile关键字究竟能干什么呢?接下来我将就此问题进行讨论。

  一个使用volatile关键字定义变量,其实就是告诉编译系统这变量可能会被意想不到地改变。那么编译时,编译器就不会自作主张的去假设这个变量的值,而进行代码的优化了。确切的说就是,编译器在编译代码时,优化器每次遇到这个变量,都会到内存中重新读取,而不会使用保存在寄存器里的备份来对代码进行优化。

  我们已经了解了volatile关键字的基本作用。那么,在什么情况下使用volatile关键字呢?一般说来,在如下的几种情况通常会使用volatile关键字:

  • 在中断服务程序中修改的,供其它程序检测的变量,通常需要定义为volatile;
  • 在多任务环境下,各任务间共享的标志,通常也需要定义为volatile;
  • 存储器映射的硬件寄存器通常也需要定义为volatile,因为每次对它的读写都可能有不同意义;

extern

 在C语言中,修饰符extern用在变量或者函数的声明前,用来以标识变量或者函数的定义在别的文件中,提示编译器遇到此变量或者函数时,在其它文件中寻找其定义。extern关键字的用法有几种,我们下面对其进行说明。

(1)extern修饰变量的声明

  extern关键字可以用来修饰变量,表示该变量在别的文件中已有声明。例如:我们在文件file1.c中声明了变量int var,然后我们又需要再file2.c中使用该变量,则可在文件file2.c中声明extern int var,就可在文件file2.c中使用该变量了。

  佷显然使用extern关键字修饰的变量都是全局变量,因为在其它文件中引用局部变量是不会有意义的,也超出了局部变量的作用域。

  说到作用域,我们需要说明,尽管使用extern关键字修饰的变量,其原本都是全局变量,但如果extern int var声明处于某一函数体内,那么其作用域就在函数体内。这其实与一般变量的作用域是相同的。

(2)extern修饰函数声明

  从本质上来讲,使用extern关键字函数和变量没有什么区别。如果我们在文件file1.c中定义有函数void fun(int var),而我们在文件file2.c中想要应用,那么我们可以在file2.c中声明extern void fun(int var),而使用则与在file1.c中并无区别。

  当然,应用其它文件中的函数,更常用的方式是引用相应的头文件。那么使用extern关键字与直接引用头文件有什么不同呢?首先来讲,引用头文件是一种预处理,而extern声明则应该是链接层面的实现。其次,对于大批量引用自然是使用头文件比较方便,但如果我们只是使用个别函数,当然还是使用extern更为直接。

(3)extern用来进行链接指定

  extern用来进行链接指定一般用于混合编程,如果我们要在C++程序中调用C代码,则我们就需要使用extern “C”来声明,这样连接器就会使用C的规范来链接这部分代码。

(4) extern与static

  从某种意义上来说,extern关键字与static关键字是相反的,extern关键字是声明想要调用的外部变量和函数。而static关键字正好声明为自己使用。当然使用static关键字声明一个变量时,同时也定义了该变量。而extern声明一个变量时,仅是声明,因为该变量早已在其他地方定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值