#@date:			2014-06-14
#@author: gerui
#@email: forgerui@gmail.com

Contents


  1. extern的作用一般是用来声音一个外部变量和函数。一般在头文件hello.h中进行extern int a;的声明,在hello.c中进行a = 10;的定义。

  2. 如果在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定义的地方。

  3. static在hello.h中声明一个全局static int aa = 1;时一般会同时进行定义,这样在hello1.c中和hello2.c中共同使用aa这个变量。

  4. 当使用extern C关键词时,表明采用C的格式生成变量或函数名称,因为C++由于重载的函数同名的存在,会在中间生成一个别名。使用extern C时,就不使用别名,直接保留原有的名称。

  5. 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 ……可以组合出许多种情况。

  6. 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。所有未加static前缀的全局变量和函数都具有全局可见性,可以通过extern表明在文件外部查找。如果加了static,将只能在包含的文件中使用。全局变量和静态变量都是静态存储方式,静态变量的作用于当前源文件。

  7. 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围

  8. 下面的语句执行时,局部变量的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;
    }
  9. 整体上,static有以下两个作用:

    1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。

    2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。

References


  1. http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html

  2. http://blog.csdn.net/yingxunren/article/details/3968800

  3. http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777441.html

###C中的extern-static-const关键词的更多相关文章

  1. OC中的extern,static,const

    const的作用: const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p). 被const修饰的变量是只读的. static的作用: 修饰局部变量: 1.延长局部变量的生命周期,程序结束才会 ...

  2. (转)全局变量、extern/static/const区别与联系

    全局变量.extern/static/const区别与联系 编译单元(模块):     在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LIN ...

  3. extern static const abstract virtual

    extern static const abstract virtual const const.常量,初始化过后值不能再变化的变量.

  4. OC中extern,static,const的用法

    1.const的作用: const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p). 例如 NSString *const SIAlertViewWillDismissNotification; ...

  5. ECMAScript 6中的let和const关键词

    ECMAScript 6中多了两个定义变量的关键词,一个是let,另一个是const,后者顾名思义就是常量定义,前者的作用域范围是块级的. 一般写过js的童鞋都知道,同其他语言一样,JS中的变量作用域 ...

  6. const extern static 终极指南

    const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...

  7. let和const关键词

    ECMAScript 6中的let和const关键词 2013-11-28 21:46 by BarretLee, 21 阅读, 0 评论, 收藏, 编辑 ECMAScript 6中多了两个定义变量的 ...

  8. Objective-C中的const ,extern,static

    一.const 1>对于const,记住关键的一点,它只是修饰右边的变量. 例如: - (void)viewDidLoad { [super viewDidLoad]; // const两种用法 ...

  9. OC中使用 static 、 extern、 const使用

    static static用于定义静态变量,静态变量只会被初始化一次,并且直到程序销毁时才会释放 static NSString *str = @"asdfa"; const co ...

  10. static const vs. extern const

    在实现文件(.m文件)中使用static const来定义“只在编译单元内可见的常量”(只在.m文件内可见),由于此类常量不在全局符号表中,所以无须为其名称加类名前缀(一般以k开头). 在头文件中使用 ...

随机推荐

  1. cadence16.6 中orcad导出网表时ERROR (ORCAP-5004)(win7 旗舰版32位)

    1,选择开始>运行,打开运行窗口.2,输入cmd,打开命令行窗口.3,进入cmd,找到orpxllite.ocx和orTrueReuse.ocx的所在的目录4,输入以下命令:regsvr32 & ...

  2. Keil MDK 5.0发布了

          从上图可以看出MDK500.EXE (294,308K)分成了两部分,MDK核和software packs.MDK核跟以往一样分成四个部分,编辑器,编译器,包安装,调试跟踪.此版soft ...

  3. Activity详解

    Activity是android应用的重要组成单元之一(另外3个是Service,BroadcastReceiver和ContentProvider).实际应用包含了多个Activity,不同的Act ...

  4. HTTP笔记:URI与URL

    URI与URL 简单理解是这样的:理解URI和URL的区别,我们引入URN这个概念.URI = Universal Resource Identifier 统一资源标志符URL = Universal ...

  5. c++中类长度解析

    通常我们定义一个类,它所占的空间有多大呢? 首先我们看一下下面的这个类 class A{ public: void func1(void){ printf("11111heihei\n&qu ...

  6. 编写一个Animal类,具有属性:种类;具有功能:吃、睡。定义其子类Fish 和Dog,定义主类E,在其main方法中分别创建其对象并测试对象的特性。

    package animal; public class Animal { //成员属性 private String kind; public String getKind() { return k ...

  7. 把pgboucer做成postgresql服务

    把pgbouncer启动命令加入到postgresql服务配置里面.这样方便操作 vi /etc/init.d/postgresql 加入如下红色命令.路径换成你的pgbouncer安装目录 in s ...

  8. Winfrom treeview 如何从多个数据表中获取数据动态生成

    本文转载:http://www.cnblogs.com/VincentLuo/archive/2008/03/29/1128987.html 在 汪洋怡舟的这篇文章中[http://www.cnblo ...

  9. VMware 虚拟机安装 Mac OS X Mountain Lion 苹果系统

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  10. 【Android】 图片编辑:创建圆角图片

    创建圆角图片的方式大同小异,最简单的就是 9.png 美工做出来的就是.这种最省事直接设置就可以. 另外一种就是通过裁剪 这里的剪裁指的是依据原图我们自己生成一张新的bitmap,这个时候指定图片的目 ...