• 关于声明变量关键字 extern 的搜索知识点


    我定义了一个头文件,在头文件中需要先声明一下用的几个变量或者其他的数据,但是,我不在头文件中定义,

    比如下面的内容


    extern const int key1;
    extern const int key2;


    /*
    extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,
    提示编译器遇到此变量和函数时在其他模块中寻找其定义。
    另外,extern也可用来进行链接指定。
    也就是说,extern 只是声明,没有定义;它会在其他文件中定义;
    */

    在360 百科中搜索到的例子内容是如下:

    在一个源文件里定义了一个数组:char a;

    在另外一个文件里用下列语句进行了声明: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;这是一个定义,不是声明。

  • 相关阅读:
    BZOJ 3343 教主的魔法 分块
    HDU 3118 Arbiter 判定奇圈
    Atitit. Attilax企业框架 AEF的发展里程总结
    HDU 2009 整除的尾数 题解
    多态的应用《植物大战僵尸》
    Unity3D调用摄像头显示当前拍摄画面
    oracle下session的查询与删除
    为easyUI的dataGrid加入自己的查询框
    JQuery EasyUI Combobox 实现省市二级联动菜单
    hadoop 2.4.1 集群安装二
  • 原文地址:https://www.cnblogs.com/aiyq195/p/6391601.html
Copyright © 2020-2023  润新知