1

BitMap ファイルのヘッダーをマップするために構造体を使用しようとしています。コンパイラは 4 バイト (32 ビット) のアライメントを行っているようですが、2 バイトが必要です。以下のようにコンパイラディレクティブを介してそれを変更しようとしました

#pragma pack(2)

__attribute__ ((aligned(xx)));

この2つは効果がないようです。これを行う別の方法はありますか?Mac OS X Lion で XCode 4.3 を使用しています。Apple LLVM と Apple GCC コンパイラの両方をテストしました。

構造体型の定義は次のとおりです

typedef struct {
    int16_t bfType; 
    int32_t bfSize;
    int16_t bfReserved1;
    int16_t bfReserved2;
    int32_t bfOffBits;
    int32_t biSize;
    int32_t biWidth;
    int32_t biHeight;
    int16_t biPlanes;
    int16_t biBitCount;
    int32_t biComression;
    int32_t biSizeImage;
    int32_t biXPelsPerMeter;
    int32_t biYPelsPerMeter;
    int32_t biClrUsed;
    int32_t biClrImportant;
} THeader;
4

1 に答える 1

2

は?私のマシンで動作しますか?pack プラグマが別の場所でオーバーライドされている可能性があることに注意してください。

#include <inttypes.h>
#include <stddef.h>

#pragma pack(push,2)

typedef struct {
int16_t bfType; 
int32_t bfSize;
int16_t bfReserved1;
int16_t bfReserved2;
int32_t bfOffBits;
int32_t biSize;
int32_t biWidth;
int32_t biHeight;
int16_t biPlanes;
int16_t biBitCount;
int32_t biComression;
int32_t biSizeImage;
int32_t biXPelsPerMeter;
int32_t biYPelsPerMeter;
int32_t biClrUsed;
int32_t biClrImportant;
} THeader;

#pragma pack(pop)

#include <stdio.h>

int main(void)
{
printf("%lu\n", offsetof(THeader, bfType));
printf("%lu\n", offsetof(THeader, bfSize));
printf("%lu\n", offsetof(THeader, bfReserved1));
printf("%lu\n", offsetof(THeader, bfReserved2));
return 0;
}


$ clang -o pack pack.c
$ ./pack
0
2
6
8
于 2012-05-29T17:07:37.017 に答える