• c 中extern的使用


    http://baike.baidu.com/view/963932.htm

    在一个源文件里定义了一个数组:char a[6];
    在另外一个文件里用下列语句进行了声明:extern char *a;
    请问,这样可以吗?
    答案与分析:
    1)、不可以,程序运行时会告诉你非法访问。原因在于,指向类型T的指针并不等价于类型T的数组。extern char *a声明的是一个指针变量而不是字符数组,因此与实际的定义不同,从而造成运行时非法访问。应该将声明改为extern char a[ ]。
    2)、例子分析如下,如果a[] = "abcd",则外部变量a=0x12345678 (数组的起始地址),而*a是重新定义了一个指针变量,a的地址可能是0x87654321,直接使用*a是错误的.
    3)、这提示我们,在使用extern时候要严格对应声明时的格式,在实际编程中,这样的错误屡见不鲜。
    4)、extern用在变量声明中常常有这样一个作用,你在*.c文件中声明了一个全局的变量,这个全局的变量如果要被引用,就放在*.h中并用extern来声明。
    这个关键字真的比较可恶,在定义(函数)的时候,这个extern居然可以被省略,所以会让你搞不清楚到底是声明还是定义,下面分变量和函数两类来说:
    尤其是对于变量来说。
    extern int a;//声明一个全局变量a
    int a; //定义一个全局变量a
    extern int a =0 ;//定义一个全局变量a 并给初值。一旦给予赋值,一定是定义,定义才会分配存储空间。
    int a =0;//定义一个全局变量a,并给初值,
    声明之后你不能直接使用这个变量,需要定义之后才能使用。
    第四个等于第三个,都是定义一个可以被外部使用的全局变量,并给初值。
    糊涂了吧,他们看上去可真像。但是定义只能出现在一处。也就是说,不管是int a;还是int a=0;都只能出现一次,而那个extern int a可以出现很多次
    当你要引用一个全局变量的时候,你就要声明extern int a;这时候extern不能省略,因为省略了,就变成int a;这是一个定义,不是声明。
  • 相关阅读:
    【Spark】Spark Streaming 动态更新filter关注的内容
    【Scala】Scala-Option-Null的蹊跷
    java-汉字转化拼音(纯java)
    java-汉字转换拼音-pinyin4j.jar
    mysql-拼接字段concat,concat_ws函数
    sql-将查询字段拼接起来
    sql-insert一条语句执行多条数据插入
    证券挂单时间
    jquery-通过js编写弹出窗口
    html-css控制背景图全屏拉伸不重复显示
  • 原文地址:https://www.cnblogs.com/SevenLX/p/3724812.html
Copyright © 2020-2023  润新知