2017-03-10 7 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:1つのアンダースコアがファイルスコープにあります。 – 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: 

このエラーは、それは完全に無関係なエラーだ、「機能別のファイルからインクルードされた」ことを伝えるされていません。 "from from"の部分は、コンパイラがその後に表示される行にどのようにして到達したかを伝えるだけです(質問にはありません)。

+0

はい、他のファイルvbst.hにはbst.hが含まれています。私は2つの線が違っていたことに気付かなかった。ありがとうございました。 – PleaseNoBugs

0

あなたのインクルードガードは正常です。問題は、pruneBSTNode関数の複数の異なる署名を宣言したことです。ヘッダーと.cファイルが戻り値の型と引数の型に合っていることを確認してください。

0
__BST_INCLUDED 

それはヘッダをコンパイルすることになると、私の推薦は、あなたが警備員

#ifndef FILE_NAME_HPP 
#define FILE_NAME_HPP 


#endif 

しかし、悲しいかなを含めるために、あなたがより一般的な規則を使用することで、他に

__BST_INCLUDED__. 

と同じではありません他の人のように、言った。あなたのエラーはそこから来ていません。