【问题标题】:Including typedef enum from header file in another header file将头文件中的 typedef 枚举包含在另一个头文件中
【发布时间】: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 定义中的每个成员之后都需要;

标签: c enums typedef


【解决方案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 确实提供了一个工作示例,并且他的代码对于任何偶然进入该线程的人来说都是完美的编译!

【讨论】:

    猜你喜欢
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    相关资源
    最近更新 更多