【问题标题】:How to include a specific header file without having a conflict如何在不发生冲突的情况下包含特定的头文件
【发布时间】:2013-03-28 09:52:11
【问题描述】:

我的文件是

main.c

#include"A.h"
#include"B.h"

A.c

#include"A.h"

B.c

#include"B.h"

我有一个文件,其中包含我定义的几个结构,我应该在所有文件中使用它们,即A.c , B.c, main.c,甚至是A and B 的头文件。

所以我有

A.hB.h 都有

#include"struct.h"

现在,我在 main.c 中看到了这一点

我将对这两种结构进行多次声明,我该如何摆脱这个问题。我应该改变我的结构?

谢谢

【问题讨论】:

  • 您的头文件中确实有防护栅栏,以防止您担心的多个声明,对吧?
  • 了解include guards
  • @WhozCraig 我不确定那是什么?
  • @Kraken 您在下面有很多示例,它们将向您展示它们是什么。或查看here,或大约三打类似帖子中的任何一个。

标签: c compilation header


【解决方案1】:

使用包含守卫。

aheader.h:

#ifndef AHEADER_H
#define AHEADER_H

// ... rest of header here

#endif

bheader.h:

#ifndef BHEADER_H
#define BHEADER_H

// ... rest of header here

#endif

【讨论】:

  • 当然在structs.h 头文件(或任何其他头文件)中做同样的事情。
  • @JoachimPileborg 我应该对每个文件都这样做吗(我想我应该确保没有任何声明重复),但如果我接受我的情况,那么我想只有 struct.h 应该有这些守卫,对吧?因为这是唯一容易重复的声明?
  • @svk aheader.hstruct.hbheader.h 也有 struct.h。所以aheader.hbheader.h 都将被包括在内,因此struct.h 也将被包括两次??
  • @Kraken 你应该养成对所有头文件都这样做的习惯。
  • 适当注明。谢谢人们。很长时间以来一直对此感到困惑。干杯。
【解决方案2】:

你可以这样使用警卫,

#ifndef MY_STRUCT
#define MY_STRUCT
#include "struct.h"
#endif

如果您想有选择地处理不应该重复的部分

【讨论】:

    【解决方案3】:

    将头文件包装在include guards.中,如下所示:

    #ifndef MYHEADER_H
    #define MYHEADER_H
    
        // your definitions
    
    #endif
    

    每个头文件都应该有自己的具有唯一名称的保护。上面翻译成英文的预处理器指令是这样说的:“如果没有定义MYHEADER_H,那么定义它并粘贴内容直到#endif指令。”这保证了单个标题在单个翻译单元中只包含一次。

    【讨论】:

      【解决方案4】:

      只需使用所谓的header guard 即可确保只包含一次“struct.h”:

      // struct.h
      #ifndef STRUCT_H
      #define STRUCT_H
      
      struct ...{
      
      }
      
      #endif
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-01
        • 1970-01-01
        相关资源
        最近更新 更多