【问题标题】:Multiple application header files included error in C多个应用程序头文件在 C 中包含错误
【发布时间】:2020-07-22 04:30:47
【问题描述】:

我正在做一个从 INTEGRITY OS 到 UBUNTU 的移植项目。面临编译器错误,如下所述。即使没有在 INTEGRITY OS 中编译,我认为那里没有错误。 我找到了根本原因。我期待解决方案如何实现这一目标。

main.c

#include "file1.h"
#include "file2.h"
#include "file3.h"
.
.
.

里面的所有文件来自 file1.hfile3.h 在每个文件的开头。

#ifdef INC_HEADER_FILE
    #error Multiple header files included.
#endif
#define INC_HEADER_FILE
.
.
.

上面编译时抛出错误

In file included from ../main.c:
../file1.h: error: #error Multiple application header files included.
 #   error Multiple application header files included.
    ^~~~~

file1.hfile3.h 的所有文件都抛出相同的错误

【问题讨论】:

  • 在您的问题中显示一些minimal reproducible example。阅读Modern Cthis C referenceGCC的文档、C11标准n1570CPP的文档、GDB的文档
  • “我找到了根本原因。我期待解决方案如何实现这一目标。”究竟如何实现what?如果您的所有头文件都使用相同的预处理器变量作为保护,那么您似乎希望在每个包含时都得到一个错误......
  • 另请阅读您的build automation 工具(可能是GNU makeninja...)和您的链接器(可能在binutils...中)的文档。您可能想要使用编辑器(例如GNU emacs...)和版本控制系统(例如git...),当然您应该阅读他们的文档

标签: c linux ubuntu gcc integrity


【解决方案1】:

如果这些头文件中的所有三个(或者有多少个)都使用 same 符号 INC_HEADER_FILE,那么您将只被允许包含其中 一个 .

这是因为包含(例如)file1.h 将设置该符号,这意味着包含下一个标头会报错,因为它已经定义了。

包含保护符号通常特定于头文件本身,例如INC_HEADER_1_FILE,但我没有必要这样做 - 当您只需要头文件的一个变体时,我已经看到了这种事情。

我为 LED 显示设备开发的一个系统就是一个例子,其中每个接头都有不同的尺寸。这些是由 8x8 单元构成的,但上下数量不同。将 LED 寻址映射放在头文件中可以提高动态配置所不具备的效率,并且包含保护确保我们不会尝试使用多个映射。

【讨论】:

    【解决方案2】:

    关于 header1.h 的包含保护建议:

    #ifndef HEADER1_H
    #define HEADER1_H
    ...
    #endif
    

    关于 header2.h 的包含保护建议:

    #ifndef HEADER2_H
    #define HEADER2_H
    ....
    #endif
    

    每个头文件都类似。

    结果是在任何一个编译单元(源文件.c)中任何特定的头文件都只能包含一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多