【问题标题】:Including enums defined in header包括头文件中定义的枚举
【发布时间】:2021-06-24 17:50:59
【问题描述】:

我一直在摆弄枚举,并想尝试在项目中使用它们。项目结构如下:

//协议.h

#ifndef PROTOCOL_H
#define PROTOCOL_H
enum C_C    {P_NORTH            =   0,
            P_WEST              =   1,
            P_SOUTH             =   2,
            P_EAST              =   3};

#endif 

// 其他.h

#include "protocol.h"
struct cmd {
    enum C_C code : 4;
};

void make_cmd(struct cmd*, enum C_C);

此文件触发以下错误:

field 'code' has incomplete type
'enum C_C' declared inside parameter list will not be visible outside of this definition or declaration 

// 其他.c

#include "other.h"

void make_cmd(struct cmd* cmd, enum C_C code) {
    cmd->code = code;
}

这会引发以下错误:

conflicting types for 'make_cmd'

我尝试使用 typedef 将枚举更改为类型,但没有成功。依赖于此类参数的函数定义也会发生这种情况。

会抛出以下错误:

形参2的类型不完整

感谢您的帮助。

只有在另一个头文件中使用定义的枚举时才会发生这种情况,无论是用于结构还是用于函数原型。

我相信编译顺序一定有问题。我在 Xilinx SDK 和 Vitis 中进行了测试,结果相同。

protocol.h 包含枚举的所有定义和整个项目中使用的结构。我希望通过将这个包含在其他标题中,定义将可用于在该标题之上构建 other.h 和 other.c。

更新:

我已经在protocol.h 中移动了结构的定义,它允许我使用枚举添加一个成员而不会出现问题。我猜问题是当将protocol.h导入另一个头文件并尝试使用枚举时,编译器在

中拥有所有头文件

【问题讨论】:

  • 请显示protocol.h 和other.h 的包含位置。
  • make_cmd compiles 如果包含other.h。有些事情你没有告诉我们。
  • 不要描述或解释编译器诊断,将它们逐字复制并粘贴到问题中。它们包括您在此处发布的更多信息。
  • 头文件没有什么神奇之处,内容被插入到您包含它的位置,就像您直接键入它一样。如果 enum C_C 在引用时未定义,则会收到您在 GCC 中描述的错误消息,因此很明显 protocol.h 文件没有定义枚举。可能你有隐藏它的条件编译。当然,它应该包含未显示的保护 - 例如,如果您从另一个标题复制并粘贴它们而不更改保护宏名称,包括一个标题会隐藏另一个标题的内容 - 只是猜测。
  • 你有包括警卫吗?您是否在每个标题中使用了唯一的保护名称?

标签: c struct enums header


【解决方案1】:

这段代码编译:

#include "other.h"

void make_cmd(struct cmd* cmd, enum C_C code) {
    cmd->code = code;
}

int main(int argc, char *argv[])
{
    struct cmd cmd;

    make_cmd(&cmd, P_WEST);
}

如果你也#include "protocol.h",你会得到一个错误(类型重新定义),因为它已经包含在 other.h 中。

【讨论】:

  • 这是真的,但不是问题的答案。它不会显示相同的错误消息。我的猜测是他在两个具有相同保护宏名称的标头中包含保护。
  • 谢谢,是的,事实上问题出在另一个同名的标题上。因此,我的“protocol.h”被守卫跳过了。
  • 事实上是一个提示,因为它是一个提示,正如我在对@Clifford 的评论中提到的那样。问题是重新定义受到不允许编译“protocol.h”的守卫的保护。鉴于平台中已经定义了“protocol.h”,实际的解决方案是将名称更改为标题。
  • 您在我回答后编辑了您的问题。最初没有警卫。现在说这是一个暗示是不公平的。
猜你喜欢
  • 2015-06-05
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 2010-11-06
相关资源
最近更新 更多