2017-03-10 59 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 

但是,唉,像其他人说的。你的错误不是来自那里。