注册 登录
编程论坛 VC++/MFC

VC中的全局对象要怎做声明?

wube 发布于 2012-02-08 19:39, 1038 次点击
例如:
<AAA.h>中
CString a,b,c;    //全局对象
bool SplitFile(bool,bool); //Function head

<stdafx.h>中
#include "AAA.h"

<BBB.cpp>中
#include "stdafx.h"
void C123Dlg::OnOpenFile()
{
    CFileDialog dlg(true);
    CString msg = dlg.GetPathName();
    控件对象.SetWindowText(msg);
    a=msg;
    int i=a.ReverseFind("\\");
    int j=a.GetLength()-i;
            
    b=a.Mid(0,i) + "\\";
    c= dlg.GetFileTitle();
    UpdateData(false);

    if (QQQ(True,True)!=True)
    {
        .....
    }
    ......
}

<CCC.cpp>中
#include "stdafx.h"
bool QQQ(bool ss,bool dd)    //这段主要做单档(>1GB)切割成批次档用~
{
    CFile m_file;
    CFileDialog dlg(TRUE);
    CString AA,BB,CC;
    AA=a;BB=b;CC=c;
    .......
}

为何这样写Compliar时一直出现
.....CString a already defined in StdAfx.obj
.....CString b already defined in StdAfx.obj
.....CString c already defined in StdAfx.obj

非得要用局域对象当参数传递才会正常?
不太懂MFC~越写越像C~
只要设成全局就一定Error!

[ 本帖最后由 wube 于 2012-2-8 19:40 编辑 ]
3 回复
#2
红色警戒2012-02-08 23:56
本cpp文件中可直接饮用,其它cpp文件中要先用extern声明,如:extern CString a;
#3
hahayezhe2012-02-09 08:45
全局变量的两种声明和定义方式:
1,在头文件中声明和定义;其他.cpp文件中只需包含该头文件即可。
但需注意该头文件只能被展开一次,即被 cpp包含的次数只能一次。
楼主的代码将头文件放在预编译头文件中,该预编译分别被包含在了 aaa.cpp和ccc.cpp中 则在代码解析时生成obj时(即aaa.obj和ccc.obj都会包含了 StdAfx.obj,而 StdAfx.obj
包含了CString a,b,c; 的声明和定义,于是出现了重定义的错误)。消除该重定义(方法一:梳理头文件包含的层次关系(让其只被展开一次)。方法二:在link的命令行添加/force命令(忽略掉重定义))

2,在.cpp中声明和定义,在头文件中用extern 导出,这样其他.cpp文件只需包含该头文件 即可调用该全局变量。
#4
wube2012-02-09 09:38
所以CString这个类在整个工程中只能被定义一次~
其他地方需要引用相同类时需要加上引用符号~
程序才有办法辨别两者类是相同的意思~
新档内的类因为要继承原类原本资料~
增加的类名只是原类的一个别名的意思吧?

看来我把类和一般变量用法搞混了~
1