0

構造パッキングを 1 バイトに変更しようとしています。makefile で C コンパイラ フラグを使用して、コード内のすべての構造を 1 バイト アラインされるように定義することで処理したいと考えています。

私はこれを試しましたが、これをコードで使用して実行できます

#if (PRAGMA_PACK)
#pragma pack (1)
#endif
typedef PACKED struct _stsomefn
{

}stsomefn;

PRAGMA_PACKを使用してmakefileに設定されます

CDEFS += -DPRAGMA_PACK=1

これはうまくいきました、もちろんそうなるでしょう。ここでの問題は、このコードを変更したくないということです。そのため、makefile で定義される MACRO に同じことを行うように依頼しています。

4

3 に答える 3

4

GCC では、構造体をパックする方法は、GCC 固有の変数属性を追加することです。__attribute__ ((packed))

これをマクロとして使用したい場合は#define、適切なマクロを使用してください:

#define PACKED __attribute__ ((packed))

次に、それを使用します。

struct my_packed_struct {
  int x;
  char y;
  float z;
} PACKED;

属性の詳細については、この質問も参照してください。packed

于 2013-09-23T08:33:26.077 に答える
2

_PragmaC99 のキーワードを使用して、マクロからプラグマを簡単に発行できます。gcc はこれを問題なく実装しています。

#define PACK1 _Pragma("pack(1)")
于 2013-09-23T08:40:25.737 に答える
2

コード内のすべての構造を処理する必要がある makefile の MACRO を使用して実行したいと考えています。

これが何を意味するのかわかりませんが、メイクファイルのマクロはコードにどのように影響しますか? 実際のコードでマクロを 使用する必要があるため、コードを変更する必要がありますが、これはやりたくないと言います。

GCC を使用すると、次の方法でパッキングを制御できます。

  • #pragma pack(1)ソースコードで
  • __attribute__((packed))構造体と変数の定義について
  • -fpack-structコマンドラインで

最後のものは、コードを変更せずにメイクファイルで使用するのに適しています。

于 2013-09-23T08:47:21.053 に答える