将头文件中的 typedef 枚举包含在另一个头文件中

Posted

技术标签:

【中文标题】将头文件中的 typedef 枚举包含在另一个头文件中【英文标题】:Including typedef enum from header file in another header file 【发布时间】:2020-03-20 17:03:51 【问题描述】:

在尝试将一个头文件中的枚举包含在 antoher 中时,我一直遇到问题。 我工作的环境是使用 IAR Embedded Workbench 的嵌入式 C。

我有一个名为“enums.h”的专用枚举类型的头文件

#ifndef ENUMS_H_
#define ENUMS_H_

typedef enum

    SET,
    SCHEDULE,
    EXECUTE
action_type_t;

#endif

还有一个名为“parser.h”的解析器的头文件

#ifndef PARSER_H_
#define PARSER_H_

#include "enums.h"
#include <stdint.h>

typedef struct

    action_type_t action;
    uint16_t nbytes;
Message;

#endif

在 parser.c 中,我将标题包含为

#include "parser.h"

当我编译它时,我收到错误“标识符 action_type_t 未定义”

我在这里做错了什么?在这一点上我很难过。

谢谢

【问题讨论】:

enum 定义中的每个成员之后都需要; 【参考方案1】:

您的enum 定义缺少逗号,您的parser.h 使用uint16_t 而未能包含&lt;stdint.h&gt;,而且更迂腐的是,您的include 保护宏正在侵占保留的命名空间,因为它以@ 开头987654325@ 和一个大写字母。

这应该可行:

enums.h

#ifndef ENUMS_H_
#define ENUMS_H_

typedef enum

    SET,
    SCHEDULE,
    EXECUTE, /*the last comma is optional*/
action_type_t;

#endif

parser.h

#ifndef PARSER_H_
#define PARSER_H_

#include "enums.h"
#include <stdint.h>

typedef struct

    action_type_t action;
    uint16_t nbytes;
Message;

#endif

【讨论】:

我相信 _t 名称也是保留的,至少在 POSIX 中是这样。在 ISO C 下,我认为它更复杂,但完全避免它们可能是明智之举。 最后一个成员之后的逗号,即枚举中的 EXECUTE 真的需要吗?我试过不用逗号。它工作正常。 @MuraliKrishnaBellamkonda 最后一个是可选的。 谢谢。实际的源代码在枚举中有逗号,但是在复制文本时它们以某种方式被删除了。我尝试删除#define 中的第一个下划线,并尝试将我的 typedef 重命名为末尾没有“_t”的内容,但无济于事......【参考方案2】:

感谢所有回答的人,我想我会回来关闭这个。 原来我的项目中包含一个同名但为空的头文件...

下次我最好先看看自己的后院,然后再问别人。

但是 PSkocik 确实提供了一个工作示例,并且他的代码对于任何偶然进入该线程的人来说都是完美的编译!

【讨论】:

以上是关于将头文件中的 typedef 枚举包含在另一个头文件中的主要内容,如果未能解决你的问题,请参考以下文章

在 Objective-C 中前向声明枚举

是否可以将文件包含到头文件中

将头文件编译成DLL

在另一个文件c ++中的前向声明

无法重新定义枚举 typedef

C - #include 和多个 typedef