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.h
和 c.h
我现在已经设法解决了这个问题。我将 typedef 移到了一个新的头文件中,并单独包含了这个头文件。这最初并没有解决问题,直到我开始弄乱我的包含文件的顺序。现在似乎正在编译。
【参考方案1】:
可能是您有另一个使用相同标头保护名称的标头。
您可以在 a.h 的顶部添加一些代码来执行此操作:
#ifdef _a_h_
#error this header is already defined
#endif
通过这种方式,您可以追踪包含 a.h 的所有位置,并查看可能出现异常的位置。
如 cmets 中所述,您上面的示例有效,因此问题必须出在其他地方...
【讨论】:
这不是问题。我尝试更改标头保护名称并搜索所有文件以查找重复项,一切都很好。我现在已经注释掉了导致此错误的代码部分,并且我在代码的其他地方遇到了类似的问题(它们是 ST 的库,而不是我的代码)。我能想到的唯一其他选择是编译器优化问题,编译器认为 typedef 没有在任何地方使用,因此没有存储它。 @user1839626:我愿意赌钱不是编译器问题。真正的编译器错误非常罕见。以上是关于C - #include 和多个 typedef的主要内容,如果未能解决你的问题,请参考以下文章