C问题包括守卫
C Issue with include guards
我有一个包含防护设置的头文件。我的项目中有多个 C 文件需要此头文件进行编译。然而,当我去编译时,我收到一条错误消息,指出该函数已经包含在另一个文件中。 include guard 不应该阻止这种情况发生吗?理论上我相信我应该能够多次导入这个文件而不会出现这个问题。
#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:
#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:
这个错误并没有告诉你 "the function has been included from another file",这是一个完全不相关的错误。 "included from" 部分只是告诉您编译器如何到达其后显示的行(问题中缺少)。
你的 include 守卫很好。问题是您已经为 pruneBSTNode
函数声明了多个不同的签名。确保 header 和 .c 文件在 return 类型和参数类型上一致。
__BST_INCLUDED
与
不一样
__BST_INCLUDED__.
此外,在编译 headers 时,我的建议是您对 include guards 使用更通用的约定
#ifndef FILE_NAME_HPP
#define FILE_NAME_HPP
#endif
但是,唉,就像其他人说的那样。你的错误不是来自那里。
我有一个包含防护设置的头文件。我的项目中有多个 C 文件需要此头文件进行编译。然而,当我去编译时,我收到一条错误消息,指出该函数已经包含在另一个文件中。 include guard 不应该阻止这种情况发生吗?理论上我相信我应该能够多次导入这个文件而不会出现这个问题。
#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:
#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:
这个错误并没有告诉你 "the function has been included from another file",这是一个完全不相关的错误。 "included from" 部分只是告诉您编译器如何到达其后显示的行(问题中缺少)。
你的 include 守卫很好。问题是您已经为 pruneBSTNode
函数声明了多个不同的签名。确保 header 和 .c 文件在 return 类型和参数类型上一致。
__BST_INCLUDED
与
不一样__BST_INCLUDED__.
此外,在编译 headers 时,我的建议是您对 include guards 使用更通用的约定
#ifndef FILE_NAME_HPP
#define FILE_NAME_HPP
#endif
但是,唉,就像其他人说的那样。你的错误不是来自那里。