2011-09-27 61 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,並在一個單獨的翻譯單元中定義它們。