首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

作用域有关问题-高手帮帮小弟我

2012-02-21 
作用域问题-高手帮帮我啊编译环境:windows2003/visualc++6.0我的意图是在一个文件中定义一个全局变量,而在

作用域问题-高手帮帮我啊
编译环境:windows   2003/visual   c++   6.0
我的意图是在一个文件中定义一个全局变量,而在另一个文件中能使用,这个变量的空间在堆中分配。

//----文件PCB.cpp   的部分内容  
PCB   *   const   PCB_List=(PCB   *)malloc(PCB_NUM*sizeof(PCB));
PCB   *   TempPCB=(PCB   *)malloc(sizeof(PCB));

int   Pos_Run=0;
int   Pos_Ready=0;
int   Pos_Ready_r=0;
int   Pos_Block=0;
int   Pos_Block_r=0;
int   Pos_Free=1;

//----文件Function.cpp的部分内容
extern   PCB   *   const   PCB_List=(PCB   *)malloc(PCB_NUM*sizeof(PCB));
extern   PCB   *   TempPCB=(PCB   *)malloc(sizeof(PCB));

extern   int   Pos_Run;
extern   int   Pos_Ready;
extern   int   Pos_Ready_r;
extern   int   Pos_Block;
extern   int   Pos_Block_r;
extern   int   Pos_Free;

**************************************************************

很奇怪的错误
PCB.obj   :   error   LNK2005:   "struct   PCB   *   TempPCB "   (?TempPCB@@3PAUPCB@@A)   already   defined   in   Function.obj
Main.obj   :   error   LNK2001:   unresolved   external   symbol   "void   __cdecl   create(void) "   (?create@@YAXXZ)
Debug/Course.exe   :   fatal   error   LNK1120:   1   unresolved   externals
Error   executing   link.exe.

(1)同样是在这样的形式,为什么PCB_List   就没有错误,而TempPCB就有错误
(2)为什么文件Function.cpp的内容改为:
......
int   Pos_Run=0;
int   Pos_Ready=0;
int   Pos_Ready_r=0;
int   Pos_Block=0;
int   Pos_Block_r=0;
int   Pos_Free=1;
......
也会出现错误?




[解决办法]
(1)...重复定义了
如果Function.cpp需要使用,只需要声明一下就行了
extern PCB * const PCB_List;
extern PCB * TempPCB;
(2)
加上extern表示声明当前变量可被外部文件引用,只是声明,没有extern表示定义,你定义了两次同一个变量,链接器在链接的时候不知道用哪个,报重定义错误。
[解决办法]
extern类型的只能在定义的时候赋值,在另外的文件中使用只要声明就可以了
在定义extern类型变量时不需加extern,在别的文件中使用时加extern声明而已.
(1)TempPCB是重新赋值了.PCB_List这个声明为常指针,没有变化.
(2)去掉extern,重新定义了
[解决办法]
//----文件Function.cpp的部分内容
extern PCB * const PCB_List=(PCB *)malloc(PCB_NUM*sizeof(PCB));
extern PCB * TempPCB=(PCB *)malloc(sizeof(PCB));

改为:
extern PCB * const PCB_List;
extern PCB * TempPCB;

如果加了初始化,
那么这个就是定义了。

但是,显然在 PCB.cpp 已经定义了,
那么这里得到定义就会导致 重复定义的问题。

热点排行