读书人

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

发布时间: 2012-02-21 16:26:23 作者: rapoo

作用域问题-高手帮帮我啊
编译环境: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 已经定义了,
那么这里得到定义就会导致 重复定义的问题。

读书人网 >C语言

热点推荐