#@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. hdu 2716 Message Decowding

    Message Decowding Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  2. ST-Link STVP Cannot communicate with the device!

    用STLink在ST Visual Programmer中对STM8下载二进制文件有时会出现: 原因:多半是STM8目标板没有电源有问题,或是电源引脚虚焊:

  3. Linux协议栈代码阅读笔记(二)网络接口的配置

    Linux协议栈代码阅读笔记(二)网络接口的配置 (基于linux-2.6.11) (一)用户态通过C库函数ioctl进行网络接口的配置 例如,知名的ifconfig程序,就是通过C库函数sys_io ...

  4. How To Use Logstash and Kibana To Centralize Logs On CentOS 6

    原文链接:https://www.digitalocean.com/community/tutorials/how-to-use-logstash-and-kibana-to-centralize-l ...

  5. C#中让窗体自动靠边隐藏

    1: private void Yincangtimer_Tick(object sender, EventArgs e)//窗体隐藏事件 2: { 3: int a = Control.MouseP ...

  6. PowerDesigner 物理数据模型(PDM)

    PowerDesigner 物理数据模型(PDM) 说明 数据库脚本sqldatabasegeneration存储   目录(?)[+]   一.     PDM 介绍 物理数据模型(Physical ...

  7. 怎样在Java中实现基本数据类型与字符之间的转换

    摘要:在我们对Java的学习当中数据类型之间的转换,是我们常见的事,我们也都知道基本数据类型之间有自动转换和强制转换,在int   . short  . long .float .double之间的转 ...

  8. VS项目如何运用svn的忽略列表

    在实际的项目开发中,有些文件(比如bin,obj下的文件)是不需要放在svn里面的,因为每次都会重新生成. 该如何排除这些文件那? 我试着在svn server上删除了这些文件夹,但是在文件夹上还是显 ...

  9. 区域医疗移动医疗影像解决方案2--基于FLEX的PACS

    基于Flex的PACS和基于HTML5的PACS,都不是基于DICOM的WADO的方式,即所有的图像操作,移动.缩放.旋转.测量.伪彩.窗宽窗位调整等都是在本地浏览器能够完成,不用和服务器进行频繁的交 ...

  10. Maven学习小结(一 初探)

    1.下载Maven,解压并设置到环境变量中 https://maven.apache.org/download.cgi 需要先设置“JAVA_HOME”,否则报错: 之后查看Maven版本成功: 1. ...