全局头文件的疑问(globals.h)高手进
现在有一个VC工程,为了简化对问题的表述,假设有以下几个文件:
(1)Globals.h 这个文件有一些全局变量和函数,该文件被StdAfx.h包含。
(2)A.cpp
(3)B.CPP
(4)C.CPP
现在在Globals.h中定义一个全局的CFile对象,该对象在A.CPP中打开或创建,A.cpp和B.cpp要对文件进行读写操作,C.CPP对文件进行关闭。
现在发现几个问题如下:
(1)在Globals.h中声明变量:
CFile f_wt;
CFileException e;
在A.cpp中:
if(f_wt.Open("D:\\wzw.txt", CFile::modeCreate | CFile::modeWrite, &e))
{
AfxMessageBox(" 打开铱星记录文件失败!");
return FALSE;
}
运行就会出现错误:
A.obj : error LNK2005: "class CFile f_wt" (?f_wt@@3VCFile@@A) already defined in 318SPDlg.obj
StdAfx.obj : error LNK2005: "class CFile f_wt" (?f_wt@@3VCFile@@A) already defined in 318SPDlg.obj
难道Globals.h中的变量只能声明为const类型吗?
(2) 在Globals.h中声明变量:
Const CFile f_wt;
Const CFileException e;
在A.cpp中:
if(!(const_cast<CFile>(f_wt).Open("D:\\wzw.txt", CFile::modeCreate | CFile::modeWrite, static_cast<CFileException>(e))))
{
AfxMessageBox(" 打开铱星记录文件失败!");
return FALSE;
}
运行就会出现错误:
A.cpp(134) : error C2440: 'const_cast' : cannot convert from 'const class CFile' to 'class CFile'
A.cpp(134) : error C2440: 'static_cast' : cannot convert from 'const class CFileException' to 'class CFileException'
即使在Globals.h中将文件相关的变量声明为指针:
Const CFile *f_wt;
Const CFileException *e;
在A.cpp,B.cpp的转换中(cast_const)也会出现问题。不知道是不是我cast_const转换存在问题。但我感觉总是存在这样的强制转换,难免会对程序的稳定性和健壮性产生影响。
(3)因为对同一个文件的操作在好几个CPP中进行,所以我不得已将CFile声明为全局变量,并放到单独的Globals.h中,该头文件被StdAfx.h包含。很纳闷为什么Cfile变量非要被声明为Const类型?有这条强制规定吗?
[解决办法]
头文件中如果不用命名空间不要直接定义对象
把对象放在 cpp中
比如 你再加一个 Globals.cpp
在h中
extern CFile f_wt;
extern CFileException e;
在cpp中示例话对象,这个cpp可以是任意的cpp中
CFile f_wt;
CFileException e;
[解决办法]
Globals.h 最开始添加
#pragm once
[解决办法]