multiple definition

来源:互联网 发布:牧原股份 知乎 编辑:程序博客网 时间:2024/06/08 10:05

   今天的代码让我感觉编译器像是发神经了,到底是不是呢?先记录下来吧

//_afxstat.cpp#include "_afxstat.h"AFX_MODULE_THREAD_STATE *AfxGetModuleThreadState(){return _afxModuleThreadState.GetData();}
//_afxstat.h#ifndef AFX_MODULE_THREAD_STAT_H#define AFX_MODULE_THREAD_STAT_H#ifndef __AFXTLS_H__#include "_afxtls.h"#endif class CWinThread;class AFX_MODULE_THREAD_STATE : public CNoTrackObject{public:CWinThread *m_pCurrentWinThread;};THREAD_LOCAL(AFX_MODULE_THREAD_STATE, _afxModuleThreadState)AFX_MODULE_THREAD_STATE *AfxGetModuleThreadState();#endif
//afxtls.h#ifndef _AFXTLS_H#define _AFXTLS_H#include <windows.h>#define THREAD_LOCAL(x, y) CThreadLocal<x>  y;class CSimpleList{public:CSimpleList(int nNextOffset);void Construct(int nNextOffset);BOOL IsEmpty()const;void AddHead(void *p);void RemoveAll();void *GetHead()const;void *GetNext(void *p)const;BOOL Remove(void *p);void *m_pHead;size_t m_nNextOffset;void **GetNextPtr(void *p)const;protected:};inline CSimpleList::CSimpleList(int nNextOffset){m_pHead = NULL; m_nNextOffset = nNextOffset;}inline void CSimpleList::Construct(int nNextOffset){m_nNextOffset = nNextOffset;}inline BOOL CSimpleList::IsEmpty()const{return m_pHead == NULL;}inline void CSimpleList::RemoveAll(){m_pHead == NULL;}inline void* CSimpleList::GetHead()const{return m_pHead;}inline void* CSimpleList::GetNext(void *preElement)const{return *GetNextPtr(preElement);}inline void** CSimpleList::GetNextPtr(void *p)const{return (void**)((BYTE*)p + m_nNextOffset);}template<class TYPE>class CTypedSimpleList:public CSimpleList{public :CTypedSimpleList(int nNextOffset = 0):CSimpleList(nNextOffset){}void AddHead(TYPE p){CSimpleList::AddHead((void*)p);}TYPE GetHead(){return (TYPE)CSimpleList::GetHead();}TYPE GetNext(TYPE p){return (TYPE)CSimpleList::GetNext(p);}BOOL Remove(TYPE p){return CSimpleList::Remove(p);}operator TYPE(){return (TYPE)CSimpleList::GetHead();}};class CNoTrackObject{public:void* operator new (size_t nSize);void operator delete(void *);virtual ~CNoTrackObject(){}};struct CThreadData : public CNoTrackObject{CThreadData* pNext;int nCount;LPVOID *pData;};struct CSlotData{DWORD dwFlags;HINSTANCE hInst;};class CThreadSlotData{public:CThreadSlotData();int AllocSlot();void FreeSlot(int nSlot);void* GetThreadValue(int nSlot);void SetValue(int nSlot, void *pValue);void DeleteValues(HINSTANCE hInst, BOOL bAll = FALSE);DWORD m_tlsIndex;int m_nAlloc;int m_nRover;int m_nMax;CSlotData *m_pSlotData;CTypedSimpleList<CThreadData*> m_list;CRITICAL_SECTION m_cs;void* operator new(size_t,void *p){return p;}void DeleteValues(CThreadData *pData, HINSTANCE hInst);~CThreadSlotData();};class CThreadLocalObject{public:CNoTrackObject *GetData(CNoTrackObject* (*pfnCreateObject)());CNoTrackObject *GetDataNA();DWORD m_nSlot;~CThreadLocalObject();};template<class TYPE>class CThreadLocal : public CThreadLocalObject{public:TYPE* GetData(){TYPE *pData = (TYPE*)CThreadLocalObject::GetData(&CreateObject);return pData;}TYPE* GetDataNA(){TYPE *pData = (TYPE*)CThreadLocalObject::GetDataNA();return pData;}operator TYPE*(){return GetData();}TYPE *operator->(){return GetData();}public:static CNoTrackObject* CreateObject(){return new TYPE;}};#endif

C:\Users\zhong\Documents\devc++项目\test\_afxstat.oIn function `Z23AfxGetModuleThreadStatev':

3 C:\Users\zhong\Documents\devc++项目\test\_afxstat.cppmultiple definition of `_afxModuleThreadState'

C:\Users\zhong\Documents\devc++项目\test\thrdcore.oC:\Users\zhong\Documents\devc++项目\test/thrdcore.cpp:8: first defined here

************************************************************************************************************************************

原因找到了,是同一个头文件被两个cpp文件包含了,由于宏定义的有效单元是cpp文件,所以用过#ifndef的方式不能防止一个头文件中的变量被两个cpp文件包含。还有一点,变量最好定义在cpp文件中,不要定义在头文件中。

编译器还是不会发神经的,错误的原因总是在自己

原创粉丝点击