8

私が構造を持っていると仮定しましょう:

struct A {
  uint16_t a;
  uint64_t b;
};

パディングなしで A のサイズを取得する方法はありますか? すなわち: すべてのメンバーの sizeof の合計 (再帰的でない場合でも)。

通常sizeof(A) == 16. 、私はしたいと思い__GCC_sizeof__(A) == 10ます。

実際のコードに影響を与えないテストコードでそれが必要です。つまり、構造定義に"#pragma"s も no もありません。"__attribute__"( で実行できますが#ifdef TEST、非常に醜いです)。

ポータブルである必要はありませんGCC。十分です。

ありがとう!

4

4 に答える 4

5

sizeof(A::a) + sizeof(A::b)はあなたのためにトリックをするべきだと思います。構造体のパディングされていないサイズを取得する方法はありません。そのようなサイズはプログラムにどのような目的を果たすことができるのでしょうか。

于 2013-01-17T14:34:53.000 に答える
3

目的は、テスト内から新しく追加された構造メンバーを追跡する機能です。

最初に聞いておけば良かったのに…

答えはイエスです。方法はありますが#include、ファイルごとではありません。AST/ABT 構造を取得してフィールドを一覧表示できるものを使用してから、事前に登録されたリストと比較する必要があります。これは、たとえば Clang で可能なことです。


でも今は、もう一歩先に進みましょう。なぜそれをテストしたいのですか?もろい!

機能をテストする方が良いでしょう。隠されているものは理由があって隠されています。

各機能が正しくテストされていれば、テストに合格する限り、フィールドのリストを知っているかどうかは問題ではありません。

于 2013-01-17T18:41:24.270 に答える
2

この Stackoverflow の応答を見てみましょう。

gcc の __attribute__((packed)) / #pragma pack は安全ではありませんか?

GCC 情報については、次の Web サイトを参照してください。

http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html

構造体の前にプラグマを 1 に設定すると、バイト境界に合わせてコンパクトなサイズにする必要があるため、sizeof を使用してバイト数を取得できます。

構造体の量が少ない場合は、構造体の宣言前にプラグマを有効にし、後で無効にすることができます。

この記事があなたの取り組みに役立つことを願っています。

于 2013-01-17T14:34:01.927 に答える
0

C 言語では、プリプロセッサ ディレクティブを使用して、パディングなしで構造#pragmaをチェックできます。sizeof

#pragma pack(1)  

sizeofパディングなしで構造を提供します..

于 2013-01-17T15:27:10.853 に答える