★ BCB6的严重BUG! 关于字节对齐问题 ★
在 BCB6 自带的头文件中,所有的字节对齐都不起作用,即
#include <pshpack1.h>
#include <pshpack2.h>
#include <pshpack4.h>
#include <pshpack8.h>
#include <poppack.h>
都没有效果。当然,并不是所有的结构定义都受影响。比如:
typedef struct tagBITMAPFILEHEADER { // bmfh
WORD bfType;
DWORD bfSize; //由于对齐布起作用,在这之前添加两个字节,使bfSize的地址对齐到4的倍数
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
在C++Builder6中大小是16,应该是14。
typedef struct tagBITMAPINFOHEADER{ // bmih
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
由于这个结构不需要对齐指令,所以不受影响。
这意味着凡是你用到受影响的结构,你的程序就会有问题!!!
修改方法,将上面的五个文件(pshpack*.h, poppack.h)开头的
#pragma option push -b -a8 -pc -A- /*P_O_Push*/
和结尾的
#pragma option pop /*P_O_Pop*/
去掉,就可以了。