c++ extern关键字

来源:互联网 发布:淘宝天猫后台操作流程 编辑:程序博客网 时间:2024/05/16 02:26
  • ​extern关键字的含义
    • extern 修饰一个 符号(变量或者函数)的定义时,表示这个符号可以在此目标文件外(.o lib dll)使用,此符号支持外部链接
    • extern 修饰一个 符号的定义,告诉编译器这个符号在外部定义(将这个符号添加到.o目标文件的未解决符号表中),是一个外部符号,链接器在链接时从其他目标文件的导出符号表在搜寻这个符号,找到后就将这个符号的地址写过来,没找到就报错,“不能识别的外部符号”,具体报错方式视编译器而定
  • 关于 extern "C"
    • 编译时,变量或者函数在目标文件中的符号并不一定是原来的样子,c++一般会加上很多前后缀之类的东西,例如fun@aBc_int_int#%$,具体视编译器,但是C语言的导出符号和源文件中相同,所以,一般在链接库中将变量或者函数以C风格导出符号 ,便于在外部使用链接库中的变量或者函数
  • 使用extern 声明全局对象
    • 方法简单概括
      • 一处定义一个全局变量或者函数,定义的时候extern写不写没关系
        • extern int a=0;//定义
        • int a;
        • int a=0;
        • 以上都是定义,意义相同
      • 在另一处需要用到这个变量或者函数时用extern声明该符号,表示这个变量或者函数是在其他处定义的
        • extern int a;//这是一个声明
      • 函数的声明和定义都不需要extern,说白了,只有全局变量的声明一定需要写上extern
        • 关键是区分“声明”还是“定义”
        • 只能在一处定义,不能重复定义,否则链接时报错
    • 技巧
      • 可以在头文件里写全局变量、函数的声明
      • 自己的源文件里定义
      • 其他源文件要使用,就包含头文件,就拥有了该成员的声明
      • 注意点:尽量不要在.h里定义,因为如果多个文件包含了此头文件,会发生重复定义的错误
  • extern与static的区别
    • static修饰变量表示它是静态的,内存分配在静态区,而不是栈
    • static修饰的变量声明和定义必须同时进行,static cha str[]="asfddsf";
    • static限定变量的使用范围为本编译单元,只能用于内部连接,其他编译单元看不到它,此变量的全局只是在自身编译单元内的全局;所以如果多个编译单元都包含了定义了静态变量的头文件“xx.h”,则每个编译单元都会有这个变量的符号,而且链接时不会报错,不过由于编译器的优化,实际这个符号可能引用了同一个地址
    • 一般在cpp里定义static全局变量,因为.h经常被包含,定义太多份没用的东西
  • extern与const的区别     
    • C++中const修饰的全局常量据有跟static相同的特性,即它们只能作用于本编译模块中,但是const可以与extern连用来声明该常量可以作用于其他编译模块中, 如extern const char g_str[];
          然后在原文件中别忘了定义:     const char g_str[] = "123456";
          所以当const单独使用时它就与static相同,而当与extern一起合作的时候,它的特性就跟extern的一样了!所以对const我没有什么可以过多的描述,我只是想提醒你,const char* g_str = "123456" 与 const char g_str[] ="123465"是不同的, 前面那个const 修饰的是char *而不是g_str,它的g_str并不是常量,它被看做是一个定义了的全局变量(可以被其他编译单元使用), 所以如果你像让char*g_str遵守const的全局常量的规则,最好这么定义const char* const g_str="123456". 
0 0