我正在与嵌入式设备交换数据包,我真的希望能够在数据包定义的子字节部分使用枚举。但是我不能猜出可能有效的语法,我怀疑这是不可能的,因为我无法弄清楚如何在C ++中声明一个部分字节的子类型:
enum class communication_path_t : uint8_t {
Ethernet = 0, Wifi = 1
};
typedef struct {
communication_path_t pathByte; // works, uses one byte
// ...
// single byte split three ways
uint8_t retryCount : 3;
communication_path_t path : 3; // compile error
uint8_t deviceType : 2;
} packet_t;
那不能编译,因为你不能将8位枚举装入3位字段。编辑确切的错误:
<anonymous struct>::path’ is too small to hold all values
of ‘enum class MyNamespace::communication_path_t’ [-Werror]
我想做的是这样的事情:
enum class communication_path_t : uint8_t : 3 { ...
或
typedef uint8_t:3 three_bit_int_t;
enum class communication_path_t : three_bit_int_t { ...
这些都没有编译,我在找到引用位字段和枚举的文档时遇到了麻烦,让我怀疑没有。在我花几个小时看之前,我正在尝试做什么呢?
编辑:升级到g ++ - 4.9无法解决问题。它非常轻松,只是:
sudo apt-get install g++-4.9
g++-4.9 --version
g++-4.9 (Ubuntu 4.9.2-0ubuntu1~14.04) 4.9.2
GCC 4.9.2 released [2014-10-30]
然后将我的构建链更改为使用“g ++ - 4.9”而不是“g ++”。不幸的是我得到了同样的错误:
g++-4.9 -Dlinux -std=c++11 -pthread (...) ../common/LogPacketBreakdown.cpp
In file included from ../common/LogPacketBreakdown.cpp:12:0:
../common/PacketInfo.h:104:50: error: ‘Digiflex::<anonymous
struct>::communicationPath’ is too small to hold all values of
‘enum class Digiflex::communication_path_t’ [-Werror]
communication_path_t communicationPath : 3;
看起来好像我需要5.0并且不在Ubuntu实验工具列表中,因此我需要从源代码构建。我想我现在只能接受解决方法。谢谢大家的帮助。
答案 0 :(得分:12)
您发布的代码应该被最新的编译器接受。您可以在此错误报告中看到应该发生修复的位置:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51242
在今天的gcc中,仍然应该发出警告。在铿锵声中,你什么都看不到。
答案 1 :(得分:8)
不,C ++中没有办法typedef
一个位域,即使是枚举类型也没有。
Bitfield-ness是成员变量声明的属性,类型系统根本不支持它。
但是,你的第一个例子非常好。正如Bill所说,它是一个GCC错误,而作为GCC开发人员note,它自2013年以来只是一个警告。解决方法是使用int path : 3;
并转换枚举值,或者根本不使用enum
。
答案 2 :(得分:0)
至少在debian上使用g ++ 4.8,所以我也假设在ubuntu上。
编译器仅提供警告,此情况下的错误由 -Werror 编译器选项提供。为溢出配置 -Werror 是个好主意,因为在分配不适合位域的枚举值时会报告这一点。