C - #include 和多个 typedef

Posted

技术标签:

【中文标题】C - #include 和多个 typedef【英文标题】:C - #include and multiple typedefs 【发布时间】:2012-11-20 17:38:44 【问题描述】:

我正在使用 gcc 在 eclipse 中编写嵌入式 C 程序,但不知道如何解决某个问题。我在头文件中有一个 typedef,它受包含保护。由于我在多个头文件中使用此 typedef,因此我需要将其包含在其他头文件中,但是当我尝试编译时,无论我做什么,其中一个头文件都看不到 typedef 并抱怨未知类型名称。

我相信这说明了问题:

标题 a.h:

#ifndef _a_h
#define _a_h

typedef enum 
  USBD_OK   = 0,
  USBD_BUSY,
  USBD_FAIL,
USBD_Status;

#endif

标题 b.h:

#ifndef _b_h
#define _b_h

#include "a.h"

extern USBD_Status USB_getStatus(void);

#endif

标题 c.h:

#ifndef _c_h
#define _c_h

#include "a.h"

extern USBD_Status USBD_Sync(void);

#endif

这似乎总是导致错误“未知类型名称'USBD_Status'”,因为第二个编译的任何标头都看不到typedef。从 a.h 中删除包含保护会导致抱怨 USBD_Status 正在被重新声明。

编辑: 我已经仔细检查了所有包含路径、所有包含、所有文件名和所有包含保护 - 没有重复或拼写错误。

【问题讨论】:

代码是正确的,双重和三重检查拼写错误:USDB而不是USBD,意外使用了相同的防护装置等 使用一个简单的自包含正确示例做得很好。但就是这样,这是正确的,所以它应该工作。您要么有错字,要么没有同时包含 b.hc.h 我现在已经设法解决了这个问题。我将 typedef 移到了一个新的头文件中,并单独包含了这个头文件。这最初并没有解决问题,直到我开始弄乱我的包含文件的顺序。现在似乎正在编译。 【参考方案1】:

可能是您有另一个使用相同标头保护名称的标头。

您可以在 a.h 的顶部添加一些代码来执行此操作:

#ifdef _a_h_
#error this header is already defined
#endif

通过这种方式,您可以追踪包含 a.h 的所有位置,并查看可能出现异常的位置。

如 cmets 中所述,您上面的示例有效,因此问题必须出在其他地方...

【讨论】:

这不是问题。我尝试更改标头保护名称并搜索所有文件以查找重复项,一切都很好。我现在已经注释掉了导致此错误的代码部分,并且我在代码的其他地方遇到了类似的问题(它们是 ST 的库,而不是我的代码)。我能想到的唯一其他选择是编译器优化问题,编译器认为 typedef 没有在任何地方使用,因此没有存储它。 @user1839626:我愿意赌钱不是编译器问题。真正的编译器错误非常罕见。

以上是关于C - #include 和多个 typedef的主要内容,如果未能解决你的问题,请参考以下文章

多个连接套接字c ++

C ++中的多个输入和输出

C叉和管道多个过程

c语言线程中传输多个参数

多个定义和第一个定义的错误

C中的多个警报?