C++11 で列挙型のビット幅を指定することは可能ですか? 質問する

C++11 で列挙型のビット幅を指定することは可能ですか? 質問する

組み込みデバイスとパケットを交換していますが、パケット定義のサブバイト部分でも列挙型を使用できるようにしたいと考えています。しかし、機能する構文を推測できず、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++」の代わりに「g++-4.9」を使用します。残念ながら、同じエラーが発生します。

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 の実験ツール リストにはないので、ソースからビルドする必要があります。今のところは回避策で我慢するつもりです。ご協力ありがとうございました。

ベストアンサー1

投稿したコードは、最新のコンパイラで受け入れられるはずです。修正が行われるはずだった箇所については、次のバグ レポートを参照してください。https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51242

今日の gcc では、警告がまだ出力されるはずです。clang では、何も表示されないはずです。

おすすめ記事