2017-03-16 10 views
6

のは、このような構造を考えてみましょう:C構造の名前のないフィールドに名前を付けるにはどうすればいいですか?

struct { 
    int a; 
    int _reserved_000_[2]; 
    int b; 
    int _reserved_001_[12]; 
    int c;  
}; 

予約フィールドは、読み取りまたは書き込みが決して必要があります。私の構造は、私がたくさんのフィールドを持っているFPGAに対処する記述子を表しています。reserved私は結局ランダムな名前をつけてそれらの名前をつけました。何年も後に最初の昇順の番号付けはそれ以上何も意味しなかったからです。

だから私は今持っている:

struct { 
    int a; 
    int _reserved_3hjdds1_[2]; 
    int b; 
    int _reserved_40iuljk_[12]; 
    int c;  
}; 

それだけではなく、空のフィールド持つことがより便利になります:

struct { 
    int a; 
    int; 
    int b; 
    int; 
    int c;  
}; 

をしかし、それは動作しません。

reservedフィールドの一意の名前を見つけるのを避けることができる他の方法はありますか?

+1

構造体宣言を生成するコードジェネレータを記述します。それは予約されたメンバーのために連続して番号が付けられた名前を作成させます。特に予約メンバーの名前が変更されても問題はありません。なぜなら、誰もそれらのメンバーにアクセスする予定がないからです。 –

+0

あなたは 'reserved _ ## __ COUNTER__'のようなものを意味しますか – nowox

+0

予約されたフィールドを誰も使用する予定がないので、最初の昇順の番号付けが有意義であるかどうかは重要ではありません。私は最初のバージョンで立ち往生していたでしょう... – Dmitri

答えて

3

あなたがマクロ魔法のビットで欲しいものを達成することが可能でなければなりません:

#include <stdint.h> 

#define CONCAT(x, y) x ## y 
#define EXPAND(x, y) CONCAT(x, y) 
#define RESERVED EXPAND(reserved, __LINE__) 

struct 
{ 
    uint32_t x; 
    uint32_t RESERVED; 
    uint16_t y; 
    uint64_t RESERVED[10]; 
} s; 

これはあなたに、このようなreserved11reserved13などの識別子を与えるが、名前は明らかに問題ではありません。

+0

ニースを試してみますが、私はまだ私の[回答](http://stackoverflow.com/a/42838409/2612235=)と、 '__COUNTER__'に関するCAPITALマクロと警告を好んでいます。 '#include 'も忘れました。 – nowox

+1

@nowox '__LINE__'は標準のCですが、' __COUNTER__'はそうではありません。 – Lundin

+1

同じ行に複数の定義がある場合、 '__LINE__'は動作しませんが、少なくともコンパイラからエラーが出ることに注意してください。私はまだこれが '__COUNTER__'よりも優れていると思っています – nowox

関連する問題