C语言 关键字extern
来源:互联网 发布:java导出excel xlsx 编辑:程序博客网 时间:2024/04/30 04:09
假设有两段代码 分别在A.cpp和B.cpp中
//A.cppint i;int main(){ i = 100;}//B.cppint i;
由于A和B是分别编译,所以在编译阶段,没有问题。但是到了链接阶段:
Linking...B.obj:error LNK2005:"inti"(?i@@3HA)already defined in A.objDebug/A.exe:fatal error LNK1169:one or more multiply defined symbols foundError executing link.exe.A.exe-2 error(s),0 warning(s)
这是因为A和B文件中都定义了同名全局变量i,而在链接的时候一个程序的所有的非静态(static)全局变量要合并,所以就出现了冲突。
我们为上面的错误程序加上extern关键字:
//A.cppextern int i;int main(){ i = 100;}//B.cppint i;
编译链接成功!
这就是extern关键词的作用,extern的原理很简单,就是告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要放行!”
extern定义和申明
这个关键字真的比较可恶,在定义(函数)的时候,这个extern居然可以被省略,所以会让你搞不清楚到底是声明还是定义,下面分变量和函数两类来说:
尤其是对于变量来说。
extern int a;//声明一个全局变量aint a; //定义一个全局变量aextern int a =0 ;//定义一个全局变量a 并给初值。一旦给予赋值,一定是定义,定义才会分配存储空间。int a =0;//定义一个全局变量a,并给初值,
声明之后你不能直接使用这个变量,需要定义之后才能使用。
第四个等于第三个,都是定义一个可以被外部使用的全局变量,并给初值。
糊涂了吧,他们看上去可真像。但是定义只能出现在一处。也就是说,不管是int a;还是int a=0;都只能出现一次,而那个extern int a可以出现很多次。
参考资料:http://baike.baidu.com/link?url=ZjJjKNcFWE2I8ciPU8SfgogztwQ6GV6KBkZTSO0Eov1RHx-G45PzxrN0Vnvrhv1K
0 0
- C语言 关键字extern
- C语言extern (extern关键字基本解释)
- C语言extern (extern关键字基本解释)
- c语言关键字之 extern
- C语言中的关键字 extern
- C语言中关键字extern
- C语言中的extern关键字
- C语言中关键字extern的作用
- c语言中的static和extern关键字
- C语言关键字学习(1)----- extern
- C语言中extern关键字详解
- C语言中extern关键字详解
- 单片机C语言关键字之extern
- c语言的static和extern关键字
- C语言中的extern关键字用法
- c语言中的static和extern关键字
- C语言中extern关键字详解
- C语言学习之关键字extern
- UNIX环境高级编程第十五章 进程间通信 总结
- BZOJ 1833 [ZJOI2010]count 数字计数(数位dp)
- 动态创建物体并添加刚体属性
- ADB常用命令
- EventBus使用详解(一)——初步使用EventBus
- C语言 关键字extern
- java异常处理机制
- 1014. Waiting in Line (30)
- 数据库水平切分的实现原理解析——分库,分表,主从,集群,负载均衡器
- fatal error LNK1561:必须定义入口点 问题的解决
- 虚拟主机ip与域名建立映射关系
- Xcode技巧:项目导入外部文件后编译运行出现Undefined symbols for architecture x86_64错误
- Java中的引用
- web应用自动部署脚本