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