私はネットワーク層プロトコルをコーディングしています.Cで定義されたパックされた構造のサイズを見つける必要があります.コンパイラは余分なパディングバイトを追加する可能性があるためsizeof
、私の場合は機能が役に立たなくなります. Google を調べたところ___attribute(packed)___
、コンパイラが余分なパディング バイトを追加するのを防ぐために、このようなものを使用できることがわかりました。しかし、これは移植可能なアプローチではないと思います。私のコードは、Windows と Linux 環境の両方をサポートする必要があります。
現在、コードで定義されているすべての構造体のパック サイズをマップするマクロを定義しました。以下のコードを検討してください。
typedef struct {
...
} a_t;
typedef struct {
...
} b_t;
#define SIZE_a_t 8;
#define SIZE_b_t 10;
#define SIZEOF(XX) SIZE_##XX;
次に、メイン関数で、上記のマクロ定義を以下のように使用できます:-
int size = SIZEOF(a_t);
このアプローチは機能しますが、最善のアプローチではない可能性があると思います。Cでこの問題を効率的に解決する方法に関する提案やアイデアはありますか?
例
以下の C 構造を考えてみましょう:-
typedef struct {
uint8_t a;
uint16_t b;
} e_t;
Linux では、sizeof
関数は 3 バイトではなく 4 バイトを返します。これを防ぐために、私は現在これを行っています:-
typedef struct {
uint8_t a;
uint16_t b;
} e_t;
#define SIZE_e_t 3
#define SIZEOF(XX) SIZE_##e_t
これで、関数を呼び出すSIZEOF(e_t)
と、4 ではなく 3 が返されるはずです。