【编译】全局变量使用问题
来源:互联网 发布:淘宝房屋司法拍卖平台 编辑:程序博客网 时间:2024/05/18 03:04
一、C全局变量编译
模块1:UITest.h、UITest.cpp 模块2:MyTest.cpp 模块3:cTest.cpp【main】
//UITest.hint a = 5;int add();//UITest.cpp -模块1#include "UITest.h" int add(){ a +=a; return a;}//MyTest.cpp -模块2//#include "UITest.h" 否则编译出错 extern int a;//如果改成 static int a;表示是当前模块的一个变量,与外部无关,这样也可以和全局变量重名。int sub(){ return a/2;}//cTest.cpp -主模块extern int a; //引用外部全局变量extern int add(); //引用外部函数extern int sub();int main(int argc, char* argv[]){ cout<<a<<endl; cout<<add()<<endl; cout<<sub()<<endl; printf("Hello World!\n"); return 0;}【点评】主模块中,extern说明引用的是外部变量和函数,这时编译器会扫描所有的符号表,来填充本模块的地址。会在外部的模块中查找变量a和函数add()、sub()。
在模块2中,如果#include "UITest.h",则编译出错提示:a已经在UITest.obj中定义,原因是编译时产生几个表:未解决符号表,导出符号表和地址重定向表等。include之后,全局变量放在模块的导出符号表,模块1和模块2有相同的a,所以报错。
然而,extern会把符号放在obj文件中的未解决符号表中,而不是在导出符号表中。
导出符号表具有唯一性,而未解决符号表依赖于导出符号表。
二、另外一种全局变量引用的方法
//module1.hextern int a;//module1.c#include "module1.h"int a = 5;//module2.c#include "module1.h"//module3.c#include "module1.h"全局变量,放在cpp文件中定义,这样3个模块都共用了全局变量a,因为#include的只是extern int a。编译器扫描到头文件,会将其加入到未解决符号表。
参考:1、C++编译链接那些事
2、用extern定义全局变量
3、C语言中声明和定义的区别
4、C语言头文件规则
0 0
- 【编译】全局变量使用问题
- c语言全局变量使用问题
- 使用shell全局变量出现的问题
- .net 全局变量 静态变量使用问题
- 全局变量使用
- VC 在DLL中使用全局变量出现异常问题
- MFC 全局变量与宏定义的使用问题
- Python在函数中使用全局变量的问题
- j2ee高并发时使用全局变量需要注意的问题
- Android使用static定义全局变量被系统回收的问题
- Jquery 使用全局变量ajax请求返回的json问题
- 关于静态库中使用全局变量可能导致的问题
- 问题二十六:C++全局变量的使用实例
- 用vs编译动态库需要注意的问题,全局变量初始化
- C语言 编译、链接、全局变量
- c#中的全局变量问题
- 全局变量的问题
- 全局变量问题 error LNK2005
- shared pool之一:heap /extent /chunk/x$ksmsp
- ubuntu下载配置vsftpd
- VIM 的 dictionary 补全
- SQL解决过去M天内连续N天符合某条件问题
- TinyXML来操作XML文件(C++)
- 【编译】全局变量使用问题
- const对象引用做为形参
- windowNT的分页和非分页内存的分配
- 学计算机的,为什么要用linux?
- 2013 Linux领域年终盘点
- 2013 CocoaChina微信精选之技术汇
- 传感器转型 国内传感器应用市场不断扩大
- EBS Form中查询(Query)模式的操作符总结
- 关于元数据(Metadata) -- 菜鸟篇