2017-03-10 82 views
0

我有一個包含警衛設置的頭文件。我的項目中有多個C文件需要使用此頭文件進行編譯。當我去編譯但是我得到一個錯誤,說這個函數已經被另一個文件包含了。包括警衛不應該防止這種情況發生?理論上我相信我應該能夠導入這個文件很多次,而不是這個問題。與包含警衛的C問題

#ifndef __BST_INCLUDED 
#define __BST_INCLUDED__ 

//bunch of code here 

#endif 

錯誤:

bst.h:22:13: error: conflicting types for ‘pruneBSTNode’ 
extern void pruneBSTNode(bst *tree,bstNode *node); 
      ^
In file included from vbst.h:5:0, 
       from bstrees.c:7: 
+0

也許使用'#pragma once' –

+2

關於__BST_INCLUDED,恐懼雙下劃線! [雙下劃線被保留供庫實現使用](http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier)不好,真的怪異,難以調試的事情可能發生,如果你這樣做,並與一些庫標識符相沖突,所以不要。 – user4581301

+0

@ user4581301:所以文件範圍是單個下劃線。 – Olaf

回答

5
#ifndef __BST_INCLUDED 
#define __BST_INCLUDED__ 
//bunch of code here 
#endif 

這不會保護任何東西。出於簡單原因,__BST_INCLUDED____BST_INCLUDED不一樣,並且__BST_INCLUDED從未被定義。

但也:

bst.h:22:13: error: conflicting types for ‘pruneBSTNode’ 
extern void pruneBSTNode(bst *tree,bstNode *node); 
     ^
In file included from vbst.h:5:0, 
       from bstrees.c:7: 

這個錯誤是不會告訴你「的功能已經從另一個文件包含」,它是一個完全無關的錯誤。 「包含自」部分只是告訴你編譯器如何到達後面顯示的行(缺少該問題)。

+0

是的另一個文件vbst.h包括bst.h.我沒有注意到這兩條線是不同的。謝謝你解決了它。 – PleaseNoBugs

0

你的包括衛兵都很好。問題是您已經爲pruneBSTNode函數聲明瞭多個不同的簽名。確保頭文件和.c文件同意返回類型和參數類型。

0
__BST_INCLUDED 

是不一樣的

__BST_INCLUDED__. 

此外,當涉及到編譯頭,我的建議是,你有更多的共同約定的包括警衛

#ifndef FILE_NAME_HPP 
#define FILE_NAME_HPP 


#endif 

但是,唉,像其他人說的。你的錯誤不是來自那裏。