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
- 关键是区分“声明”还是“定义”
- 只能在一处定义,不能重复定义,否则链接时报错
- 一处定义一个全局变量或者函数,定义的时候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
- extern关键字 [C#]
- C/C++ extern关键字
- C 关键字extern、static
- C extern关键字
- C关键字extern
- C/C++关键字:extern
- c/c++ extern 关键字
- C中extern关键字
- C语言 关键字extern
- c 关键字extern
- EXTERN C 关键字
- C中extern关键字
- 【C++】extern关键字
- [C++]关键字extern
- C语言extern (extern关键字基本解释)
- C语言extern (extern关键字基本解释)
- 【extern】如何使用关键字extern "C"?
- c语言关键字之 extern
- OSX: 禁止Spotlight对一个目的索引
- 第五周项目三对象数组操作长方柱类
- Java Socket
- 可用的github ip
- IDEA 快捷键整理
- c++ extern关键字
- Linux下利用backtrace追踪函数调用堆栈以及定位段错误
- AS3.0 LoaderContext
- Vijos 1034 家族
- c语言实现通用数据结构(二):通用队列
- Oracle的pipelined函数提升数据输出性能
- OSX:一个有关AirPrint,DNS,Bonjour的文章连接
- hdu 1087 Super Jumping! Jumping! Jumping!
- saltstack入门文档