我在编程过程中将全局变量、过程等全添加在自建的public.h文件中(如下),然后在用到这些变量的时候加上#include "public.h"可是总是出现类似这样的错误:ShowDlg.obj : error LNK2005: "unsigned int __cdecl PP(void *)" (?PP@@YAIPAX@Z) already defined in jDoc.obj即这些变量(过程)在DOC类中已定义过,不必在ShowDlg类里再定义。我不知道如何避免,请各位帮忙!!!//////////////////////   //public.h内容#if !defined(AFX_PUB_)
#define AFX_PUB_int Speed;struct obj
{
CString objName;
CString Path;
CSize Size;
float weight;
float speedY;
float speedX;
float aspeedY;
float aspeedX;
float forceX;
float forceY;
};CWinThread *p_thread;
CShowDlg * pll;UINT PP(void*)
{

return 0;
}#endif

解决方案 »

  1.   

    这显然是不行的
    include和在前面右写一边是一样的
    其实最好不要用全局变量
    你加在app中
    不是到处都能访问么
    如果费用不可
    要在一处定义
    其他的地方用extern再定义一次才行
      

  2.   

    改成 extern int Speed;
    然后找一个包含此.h文件的c文件加上
    int Speed;
      

  3.   

    可能是A。h中#include "public.h",B中#include "public.h"
    并且#include "A。h"
      

  4.   

    ShowDlg.obj : error LNK2005: "unsigned int __cdecl PP(void *)" (?PP@@YAIPAX@Z) already defined in jDoc.obj
    看到这一句了吧,这说明PP的定义是在JDOC.OBJ里完成的,我猜想PP曾经在某处定义,并且编译过(JDOC.OBJ),而你可能出于某种原因将其提到单独的头文件中(PULIB.H)后,再次编译时就出错了,VC傻傻的认为你的PP没有改动(于是从.OBJ中调出PP的定义),所以不编译只连接,而连接时就出错了。你重新编译一下就好(REBULID ALL)。另外查一下,其他地方有没有PP的定义或声明,也许你忘了删除。
      

  5.   

    同意 ZHX(知心) 的意见。
    头文件是用来声明变量和函数的地方,不能用来实现cpp语句。而全局变量在定义时必须赋初值。因此做法是在h文件中声明,在cpp文件中赋初值
    头文件中:
    extern CShowDlg * pll;
    extern UINT PP(void*);cpp文件中:
    pll=NULL;
    UINT PP(void*)
    {
    ...
    }