extern 全局变量申明出现错误

孤剑 2005-03-05 05:11:46
今天学习vc++作一个小东西,来练手,但是发现错误了,自己不知道怎么改了,请教各位了!

一般的变量申明是在。h文件中,所以我将全局变量的申明也放在了。h文件中,但是不知道位置是不是对的(因为我开始弄得时候,有一个朋友所我的声明位置放错了,导致了错误,后来没有仔细看,现在可能又出现了这样的问题)

1、**.h文件内容:
// FakeQQ.h : main header file for the FAKEQQ application
//

#if !defined(AFX_FAKEQQ_H__F2880776_08A7_48C4_B67F_4DC66555839D__INCLUDED_)
#define AFX_FAKEQQ_H__F2880776_08A7_48C4_B67F_4DC66555839D__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif

#include "resource.h" // main symbols

/////////////////////////////////////////////////////////////////////////////
// CFakeQQApp:
// See FakeQQ.cpp for the implementation of this class
//

class CFakeQQApp : public CWinApp
{
public:
CFakeQQApp();

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CFakeQQApp)
public:
virtual BOOL InitInstance();
//}}AFX_VIRTUAL

// Implementation

//{{AFX_MSG(CFakeQQApp)
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};


/////////////////////////////////////////////////////////////////////////////
//////////此处为我添加的内容
//FaceIcon[]为全局变量,以下为申明的全局变量
extern HICON FaceIcon[5]; //所有头像
extern CChatSocket ChatSocket; //聊天Socket
extern CUserInfo MyInfo; //当前用户信息
extern CDatabase ChatDB; //数据库
/////////添加内容结束

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_FAKEQQ_H__F2880776_08A7_48C4_B67F_4DC66555839D__INCLUDED_)


2、对应的**.cpp文件的内容:
// FakeQQ.cpp : Defines the class behaviors for the application.
//

#include "stdafx.h"
#include "FakeQQ.h"
#include "FakeQQDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CFakeQQApp

BEGIN_MESSAGE_MAP(CFakeQQApp, CWinApp)
//{{AFX_MSG_MAP(CFakeQQApp)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFakeQQApp construction
///////////此处为我添加的内容
//配合FakeQQ.h中定义的变量
CFakeQQApp theApp;
HICON FaceIcon[];
CChatSocket ChatSocket;
CUserInfo MyInfo;
CDatabase ChatDB;
//后面的内容将陆续用到这些变量
//接下来,需要为CFakeQQDlg添加成员变量,
//用于保存用户头像的ImageList;
/////////添加内容结束

CFakeQQApp::CFakeQQApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CFakeQQApp object
/////////////////////////////////////////////////////////////////////////////
// CFakeQQApp initialization

BOOL CFakeQQApp::InitInstance()
{
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}

AfxEnableControlContainer();

//装载图片
UINT nFaceID[]={IDI_FACE0,IDI_FACE1,IDI_FACE2,IDI_FACE3,IDI_FACE4};
for(int i=0;i<sizeof(nFaceID)/sizeof(UINT);i++)
{
FaceIcon[i]=LoadIcon(nFaceID[i]);
//FaceIcon[]为全局变量,其申明在FakeQQ.h中
}

// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.

#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif

CFakeQQDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}

// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
}


3、编译后的错误提示:
--------------------Configuration: FakeQQ - Win32 Debug--------------------
Compiling...
FakeQQ.cpp
f:\vvv\vc++\fakeqq\fakeqq.h(48) : error C2146: syntax error : missing ';' before identifier 'ChatSocket'
f:\vvv\vc++\fakeqq\fakeqq.h(48) : fatal error C1004: unexpected end of file found
Generating Code...
Compiling...
FakeQQDlg.cpp
f:\vvv\vc++\fakeqq\fakeqq.h(48) : error C2146: syntax error : missing ';' before identifier 'ChatSocket'
f:\vvv\vc++\fakeqq\fakeqq.h(48) : fatal error C1004: unexpected end of file found
Generating Code...
Error executing cl.exe.

FakeQQ.

请大家帮忙解答,谢谢!
...全文
653 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiangv 2005-03-12
  • 打赏
  • 举报
回复
从无到有,叫定义
而已经有了,再告诉编译器一声,我已经定义过这变量了,不过是在别的文件里,所以叫声明
孤剑 2005-03-12
  • 打赏
  • 举报
回复
恩,谢谢各位了,好像是我没有弄清楚declaration 和difinition 的概念问题,最近找了相关的书籍看了看,等一下试一下,现谢谢各位了。等我试了知道结果了,就可以给大家结分。
qiangv 2005-03-11
  • 打赏
  • 举报
回复
.h文件include的时候是原封不动地把代码加进来。
如果在.h文件中定义了变量,在.cpp中就不要再申明了,直接可以使用了。

关于extern,使用extern但没有初始化,是声明declaration,不是变量的定义definition
不使用extern,不管是否初始化,都是定义。
如:char c//无extern,是定义
extern char c//有extern,无初始化,是声明
extern int n=5//有extern,并初始化,是定义。
sdgzhk 2005-03-11
  • 打赏
  • 举报
回复
以表点浅见:把4个定义复制到CXXXAPP theApp;下面.
HICON FaceIcon[5]; //所有头像
CChatSocket ChatSocket; //聊天Socket
CUserInfo MyInfo; //当前用户信息
CDatabase ChatDB; //数据库
wangbab 2005-03-11
  • 打赏
  • 举报
回复
.h文件里写
extern char ch;
.cpp文件里写
cha ch;
其他要使用这些全局变量的只要包含
.h就可以了。

楼上说的不错,定义和声明是2回事。变量要申明需要放在cpp文件里。头文件加上了exter后,其他文件#include该文件后就可以使用了。
孤剑 2005-03-10
  • 打赏
  • 举报
回复
谢谢各位,但是问题还有没有更好的解决方法阿!
guoqiang721029 2005-03-09
  • 打赏
  • 举报
回复
我也遇到过类似的错误,不要在头文件中定义全局变量就可以了,在源文件中定义绝对没有问题!
cqruan 2005-03-09
  • 打赏
  • 举报
回复
好象不是定义在.h中,应该是在.CPP中,

比如应用程序取名为:Test,找到:CTestApp thisApp;
在下面定义

HICON FaceIcon[5]; //所有头像
CChatSocket ChatSocket; //聊天Socket
CUserInfo MyInfo; //当前用户信息
CDatabase ChatDB; //数据库


在要用的文件头部先申明:

extern HICON FaceIcon[5]; //所有头像
extern CChatSocket ChatSocket; //聊天Socket
extern CUserInfo MyInfo; //当前用户信息
extern CDatabase ChatDB; //数据库

接下来就可以用了,我是刚学VC编程,不足之处还请各位指教


孤剑 2005-03-08
  • 打赏
  • 举报
回复
tide2355(疾风之狼)
似乎说的有一点懂了,不过还得向你请教:
头文件中已经包含了相关的处理,可是在其他的地方使用该变量时,还是时常出错阿!
希望各位能再次赐教!
tide2355 2005-03-07
  • 打赏
  • 举报
回复
你这样试试看可以么
例如,如果相应的头文件是ChatSocket.h;UserInfo.h;Database.h的话
在FakeQQ.cpp中包含头文件
// FakeQQ.cpp : Defines the class behaviors for the application.
#include "ChatSocket.h"
#include "UserInfo.h"
#include "Database.h"

在FakeQQ.h中,你的全局变量定义前申明类
class CChatSocket;
class CUserInfo;
class CDatabase;

相应的头文件必须对重复包含有处理
如:使用 #pragma once
或者
#ifndef ****_H
#define ****_H
#endif
tide2355 2005-03-07
  • 打赏
  • 举报
回复
楼上的2位好像都不对

extern HICON FaceIcon[5]; //所有头像
extern CChatSocket ChatSocket; //聊天Socket
extern CUserInfo MyInfo; //当前用户信息
extern CDatabase ChatDB; //数据库

定义之前必须先让编译器知道 CChatSocket ;CUserInfo ;CDatabase 这几个数据结构
我看你的代码里面没有以上3个类(或者结构的申明阿)
cnwolf 2005-03-05
  • 打赏
  • 举报
回复
在定义全局变量的文件中不要包含
extern HICON FaceIcon[5]; //所有头像
extern CChatSocket ChatSocket; //聊天Socket
extern CUserInfo MyInfo; //当前用户信息
extern CDatabase ChatDB; //数据库

它的意思是引用外部的全局变量,编译器会不知道用本文件定义的还是引用外部文件的
孤剑 2005-03-05
  • 打赏
  • 举报
回复
qingv:
首先谢谢你的解释,但是这样还是不好使。去掉了报告错误还是和以前一样。
qiangv 2005-03-05
  • 打赏
  • 举报
回复
extern HICON FaceIcon[5]; //所有头像
extern CChatSocket ChatSocket; //聊天Socket
extern CUserInfo MyInfo; //当前用户信息
extern CDatabase ChatDB; //数据库

把extern去掉
孤剑 2005-03-05
  • 打赏
  • 举报
回复
对了,错误出现在ChatSocket这个定义上,如果将这个语句注释掉的话,错误就出现在下一句定义了。只有把这个定义全部驱除的话,程序能正常运行。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧