2011-09-27 39 views
1

我是,头部防护解决重新定义的问题的印象。我收到的链接器错误表明在.obj文件中有重新定义。这是我包含的标题,问题在于重新定义所有全局声明。部首后卫/翻译单元问题

#ifndef DIRECT3D_H 
#define DIRECT3D_H 

// global declarations 
ID3D10Device* device; 
ID3D10Buffer* pBuffer; 
ID3D10Buffer* iBuffer; // the pointer to the index buffer 
ID3D10RenderTargetView* rtv; // the pointer to the render target view 
ID3D10DepthStencilView* dsv; // the pointer to the depth stencil view 
IDXGISwapChain* swapchain; // the pointer to the swap chain class 
ID3D10Effect* pEffect; 
ID3D10EffectTechnique* pTechnique; 
ID3D10EffectPass* pPass; 
ID3D10InputLayout* pVertexLayout; 
ID3D10EffectMatrixVariable* pTransform; // the pointer to the effect variable interface 
D3D10_PASS_DESC PassDesc; 

// function prototypes 
void initD3D(HWND hWnd); 
void render_frame(); 
void init_pipeline(); 
void cleanD3D(); 
void Init(); 

#endif 

说这个头被称为3DClass.h。它包含在3DClass.cpp中。它也被包含在另一个文件中 - 一个主要的游戏循环。现在,我意识到可能存在与头文件时,有多个翻译单位的问题,但我不明白为什么这会无法正常工作,我只是其中一个文件头,并在相应的源文件。这不应该罚款吗?

+0

你可能想阅读[这个答案](http://stackoverflow.com/questions/6923961/source-file-and-header-in-c/6924146#6924146)。 – sbi

+1

哇,所有的全局变量是什么? –

回答

8

标题警卫解决包含相同标题两次或包含隐藏递归的问题,而不是双重定义。

如果在不同的翻译单元中包含相同的标题,标题保护将无济于事。

解决的办法是从不在头文件中声明变量。如果您需要共享变量,使用extern关键词在标题中,并在翻译单元的一个声明的实际变量。

2

部首警卫仅防止头文件的受保护部分被包含两次。结果被传递给编译器,所以编译器不知道任何头文件。

因此,它将为包含标题的每个翻译单元发出这些符号(因为它无法知道是否存在编译另一个不相关翻译单元的地方)。

而且链接器无法知道你不希望这种情况发生。

要解决该问题,请在标题中声明变量extern,并在一个单独的翻译单元中定义它们。