【问题标题】:C Issue with include guardsC 包含守卫的问题
【发布时间】:2017-07-31 05:37:41
【问题描述】:

我有一个包含保护设置的头文件。我的项目中有多个需要此头文件进行编译的 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:

【问题讨论】:

  • 或许用#pragma once
  • 关于 __BST_INCLUDED,害怕双下划线! Double underscore is reserved for use by the library implementation 如果你这样做并与某些库标识符发生冲突,可能会发生糟糕且非常怪异,难以调试的事情,所以不要这样做。
  • @user4581301:文件范围内的单个下划线也是如此。

标签: c header include include-guards


【解决方案1】:
#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:

此错误并不是告诉您“该函数已从另一个文件中包含”,这是一个完全不相关的错误。 “包含自”部分只是告诉您编译器如何到达它之后显示的行(问题中缺少)。

【讨论】:

  • 是的,其他文件 vbst.h 包括 bst.h。我没有注意到这两条线是不同的。谢谢你解决了。
【解决方案2】:

您的包含警卫很好。问题是您已经为 pruneBSTNode 函数声明了多个不同的签名。确保标头和 .c 文件在返回类型和参数类型上一致。

【讨论】:

    【解决方案3】:
    __BST_INCLUDED
    

    不一样
    __BST_INCLUDED__. 
    

    此外,在编译标头时,我的建议是您对包含保护使用更通用的约定

    #ifndef FILE_NAME_HPP
    #define FILE_NAME_HPP
    
    
    #endif
    

    但是,唉,就像其他人说的那样。您的错误并非来自那里。

    【讨论】:

      猜你喜欢
      • 2012-01-19
      • 2019-04-25
      • 2013-06-22
      • 2017-11-21
      • 2011-01-24
      • 2022-01-22
      • 1970-01-01
      • 2015-03-04
      相关资源
      最近更新 更多