###C中的extern-static-const关键词
#@date: 2014-06-14
#@author: gerui
#@email: forgerui@gmail.com
Contents
extern的作用一般是用来声音一个外部变量和函数。一般在头文件hello.h中进行extern int a;的声明,在hello.c中进行a = 10;的定义。
如果在hello.h中既声明又定义,则会引起一个问题。如,hello.h中定义一个extern int a =2;,hello1.c中#include "hello.h",hello2.c中同样也`#include "hello.h",这样会出现a重定义而报错。所以,一般使用extern声明变量时,不进行定义。如果一定需要进行定义的话,那么hello2.c中的#include "hello.h"语句就要去掉,换成如下语句:
extern int a;
void print(){
cout<<a<<endl;
}
这样编译器会自动查找外部a定义的地方。
static在hello.h中声明一个全局static int aa = 1;时一般会同时进行定义,这样在hello1.c中和hello2.c中共同使用aa这个变量。
当使用extern C关键词时,表明采用C的格式生成变量或函数名称,因为C++由于重载的函数同名的存在,会在中间生成一个别名。使用extern C时,就不使用别名,直接保留原有的名称。
const char * p,char const * p,char * const p 三者的区别,见博客。const char * p 和 char const * p 等价,都是代表这个p所指向的内容是个常量,不可改变,而 char * const p 则代表p这个指针只能是固定的,不能改变其指向的位置。还有复杂的问题,如 const char ** p、 char * const * p、char const * const * const p ……可以组合出许多种情况。
静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。所有未加static前缀的全局变量和函数都具有全局可见性,可以通过extern表明在文件外部查找。如果加了static,将只能在包含的文件中使用。全局变量和静态变量都是静态存储方式,静态变量的作用于当前源文件。
把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
下面的语句执行时,局部变量的static第一次定义为10,即只初始化一次,其后的定义语句就没有作用了,他会随着循环不断减小,10、9、8、7...、1。而全局的count不受静态的count影响,会随着循环不断增加。
#include <stdio.h>
int fun(void){
static int count = 10; // 事实上此赋值语句从来没有执行过
return count--;
}
int count = 1;
int main(void) {
printf("global\t\tlocal static\n");
for(; count <= 10; ++count)
printf("%d\t\t%d\n", count, fun());
return 0;
}
整体上,static有以下两个作用:
1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。
References
http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html
http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777441.html
###C中的extern-static-const关键词的更多相关文章
- OC中的extern,static,const
const的作用: const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p). 被const修饰的变量是只读的. static的作用: 修饰局部变量: 1.延长局部变量的生命周期,程序结束才会 ...
- (转)全局变量、extern/static/const区别与联系
全局变量.extern/static/const区别与联系 编译单元(模块): 在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LIN ...
- extern static const abstract virtual
extern static const abstract virtual const const.常量,初始化过后值不能再变化的变量.
- OC中extern,static,const的用法
1.const的作用: const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p). 例如 NSString *const SIAlertViewWillDismissNotification; ...
- ECMAScript 6中的let和const关键词
ECMAScript 6中多了两个定义变量的关键词,一个是let,另一个是const,后者顾名思义就是常量定义,前者的作用域范围是块级的. 一般写过js的童鞋都知道,同其他语言一样,JS中的变量作用域 ...
- const extern static 终极指南
const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...
- let和const关键词
ECMAScript 6中的let和const关键词 2013-11-28 21:46 by BarretLee, 21 阅读, 0 评论, 收藏, 编辑 ECMAScript 6中多了两个定义变量的 ...
- Objective-C中的const ,extern,static
一.const 1>对于const,记住关键的一点,它只是修饰右边的变量. 例如: - (void)viewDidLoad { [super viewDidLoad]; // const两种用法 ...
- OC中使用 static 、 extern、 const使用
static static用于定义静态变量,静态变量只会被初始化一次,并且直到程序销毁时才会释放 static NSString *str = @"asdfa"; const co ...
- static const vs. extern const
在实现文件(.m文件)中使用static const来定义“只在编译单元内可见的常量”(只在.m文件内可见),由于此类常量不在全局符号表中,所以无须为其名称加类名前缀(一般以k开头). 在头文件中使用 ...
随机推荐
- [iOS基础控件 - 6.6.1] 展示团购数据代码
1.主控制器: // // ViewController.m // GroupPurchase // // Created by hellovoidworld on 14/12/3. // Cop ...
- 一步一步学android控件(之十五) —— DegitalClock & AnalogClock
原本计划DigitalClock和AnalogClock单独各一篇来写,但是想想,两个控件的作用都一样,就和在一起写一篇了. DegitalClock和AnalogClock控件主要用于显示当前时间信 ...
- JS实现项目查找功能
又是好久没有更新文章了,技术差,人又懒是重罪啊!! 在工作中每天都要查找目前正在接手的项目,而如果项目一多起来怎么办呢? 最近主管突然说要找一下以前的项目改一点BUG,然后我就找了半天才找到对应的文件 ...
- dataGridView控件--未将对象引用设置添加到对象的实例
上篇博客中我完成了如何将控件中的数据导出到excel中dataGridView控件--导出Excel,当我成功导出后,又再次遇到了新问题---未将对象引用设置添加到对象的实例 解决办法: 1 .将代 ...
- 关于Excel Networkdays方法的实现
最近一个程序要求excel输出的日期差为Networkdays. 在网上找了下,没有找到很好的具体实现方法. 要说明的是,微软的Microsoft.Office.Interop.Excel已经实现的N ...
- Oracle Hints具体解释
在向大家具体介绍Oracle Hints之前,首先让大家了解下Oracle Hints是什么,然后全面介绍Oracle Hints,希望对大家实用.基于代价的优化器是非常聪明的,在绝大多数情况下它会选 ...
- kvm上安装xp
主要为了看看图像显示是否有问题,跑起来系能如何,网络连接.文件共享是怎样的. 用的是雨林木风xp sp3的iso.为了提高性能,决定使用qcow2格式,预分配metadata,cache=none(查 ...
- leetcode解决问题的方法||Integer to Roman问题
problem: Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range ...
- html5中viewport使用
html5中viewport使用 转载自:http://www.maoegg.com/the-usage-of-viewport-in-html5/ 用html5开发移动应用时往往会遇到手机的分辨率或 ...
- C# 之 服务端获取远程资源
获取指定网页的远程资源可使用 WebClient.WebRequest.HttpWebRequest 三种方式来实现.当然也可使用webBrowse,webBrowse不做介绍. 通过 System. ...