在一个公用的头文件中, 定义了一个全局函数,然后其他DLL都引用这个头文件, 编译的时候提示错误
--------------------------------------------------------------------------
头文件定义:void SendErrorInfo(HWND hLogInfoWnd, LOG_TYPE sTYPE, CString sModule, CString sDepict)
{
LOG_INFO stLogInfo;
stLogInfo.sTYPE= sTYPE;
strcpy(stLogInfo.sModule, sModule);
strcpy(stLogInfo.sDepict, sDepict); COleDateTime dtTime= COleDateTime::GetCurrentTime();
strcpy(stLogInfo.sTime, dtTime.Format("HH-mm-dd"));
COPYDATASTRUCT cds;
cds.dwData=NULL;
cds.cbData=sizeof(LOG_INFO);
cds.lpData=(LPVOID)&stLogInfo;
::SendMessage(hLogInfoWnd, WM_COPYDATA, (WPARAM)NULL,(LPARAM)&cds);
}------------------------------------------------------------------------
编译错误:
LogInfoDlg.obj : error LNK2005: "void __cdecl SendErrorInfo(struct HWND__ *,enum LOG_TYPE,class CString,class CString)" (?SendErrorInfo@@YAXPAUHWND__@@W4LOG_TYPE@@VCString@@2@Z) already defined in LogInfo.obj
LogInfoDlg.obj : error LNK2005: "void __cdecl SendErrorInfo(struct HWND__ *,enum LOG_TYPE,class CString,class CString)" (?SendErrorInfo@@YAXPAUHWND__@@W4LOG_TYPE@@VCString@@2@Z) already defined in LogInfo.obj
LogInfoDlg.obj : warning LNK4006: "void __cdecl SendErrorInfo(struct HWND__ *,enum LOG_TYPE,class CString,class CString)" (?SendErrorInfo@@YAXPAUHWND__@@W4LOG_TYPE@@VCString@@2@Z) already defined in LogInfo.obj; second definition ignored
--------------------------------------------------------------------------
头文件定义:void SendErrorInfo(HWND hLogInfoWnd, LOG_TYPE sTYPE, CString sModule, CString sDepict)
{
LOG_INFO stLogInfo;
stLogInfo.sTYPE= sTYPE;
strcpy(stLogInfo.sModule, sModule);
strcpy(stLogInfo.sDepict, sDepict); COleDateTime dtTime= COleDateTime::GetCurrentTime();
strcpy(stLogInfo.sTime, dtTime.Format("HH-mm-dd"));
COPYDATASTRUCT cds;
cds.dwData=NULL;
cds.cbData=sizeof(LOG_INFO);
cds.lpData=(LPVOID)&stLogInfo;
::SendMessage(hLogInfoWnd, WM_COPYDATA, (WPARAM)NULL,(LPARAM)&cds);
}------------------------------------------------------------------------
编译错误:
LogInfoDlg.obj : error LNK2005: "void __cdecl SendErrorInfo(struct HWND__ *,enum LOG_TYPE,class CString,class CString)" (?SendErrorInfo@@YAXPAUHWND__@@W4LOG_TYPE@@VCString@@2@Z) already defined in LogInfo.obj
LogInfoDlg.obj : error LNK2005: "void __cdecl SendErrorInfo(struct HWND__ *,enum LOG_TYPE,class CString,class CString)" (?SendErrorInfo@@YAXPAUHWND__@@W4LOG_TYPE@@VCString@@2@Z) already defined in LogInfo.obj
LogInfoDlg.obj : warning LNK4006: "void __cdecl SendErrorInfo(struct HWND__ *,enum LOG_TYPE,class CString,class CString)" (?SendErrorInfo@@YAXPAUHWND__@@W4LOG_TYPE@@VCString@@2@Z) already defined in LogInfo.obj; second definition ignored
void SendErrorInfo(HWND hLogInfoWnd, LOG_TYPE sTYPE, CString sModule, CString sDepict);
就可以了
#ifndef
...
#endif
函数应该在头文件中定义,在cpp文件中实现
如果你不小心而导致了该头文件被包含多于一次,就会出现 "already defined..."连接错误。如果你想有效的避免头文件多次包含,可以考虑用宏定义。
//myheader.h
#ifndef MYHEADER_H
#define MYHEADER_H
class MyClass
{
...
}
#endif在你需要包含该头文件的地方,使用下面的方法:
#ifndef MYHEADER_H
#include "myheader.h"
#endif
#if!def _YOURHEAD_H
#define _YOURHEAD_H
.
.
.
#endif
#define _YOURHEAD_H
.
#endif
也是没有用的.要么只在一个文件中使用该头文件,要么将实现另找个CPP文件来写.否则因为VC的基本编译单元是CPP文件,对每个包含此文件的CPP都将生成函数体.