我在转换 C++的结构体:#define RASDIALPARAMSA struct tagRASDIALPARAMSA
RASDIALPARAMSA
{
    DWORD dwSize;
    CHAR  szEntryName[ 256 + 1 ];
    CHAR  szPhoneNumber[ 128 + 1 ];
    CHAR  szCallbackNumber[ 128 + 1 ];
    CHAR  szUserName[ 256 + 1 ];
    CHAR  szPassword[ 256 + 1 ];
    CHAR  szDomain[ 15 + 1 ];
};
本来是用的 packed record ,结果发现结构体长度不对。于是,我手算了一下:一共占位 1049 (4+257+129+129+257+257+16) ,我的 "packed record" 也是 1049 ,应该对啊 ,感到奇怪。
于是,在 C++里 求了一下长度,是1052... 和 Delphi中 不用 "packed" 时的长度一样 ,VC6的编译器 和 Delphi6 一样做了对齐??那我在 转结构体 的时候,如何知道什么时候应该使用 "packed" ???  求解~!!!

解决方案 »

  1.   

    delphi 当中使用packed,即为按单字节对齐 
    相当于c++里面使用了
    #pragma pack(1)
    ...//结构体定义
    #pragma pop()
      

  2.   

    调用windows api或者其他语言开发的DLL时,为了便于对齐,要用packed
      

  3.   


    #define RASDIALPARAMSA struct tagRASDIALPARAMSA
    RASDIALPARAMSA
    {
        DWORD dwSize;
        CHAR  szEntryName[ 256 + 1 ];
        CHAR  szPhoneNumber[ 128 + 1 ];
        CHAR  szCallbackNumber[ 128 + 1 ];
        CHAR  szUserName[ 256 + 1 ];
        CHAR  szPassword[ 256 + 1 ];
        CHAR  szDomain[ 15 + 1 ];
    };
    当成
    #define RASDIALPARAMSA struct tagRASDIALPARAMSA
    RASDIALPARAMSA
    {
        DWORD dwSize;
        CHAR  szEntryName[ 256 + 1 ];
        CHAR  szPhoneNumber[ 128 + 1 ];
        CHAR  szCallbackNumber[ 128 + 1 ];
        CHAR  szUserName[ 256 + 1 ];
        CHAR  szPassword[ 256 + 1 ];
        CHAR  szDomain[ 15 + 1 ];
        CHAR  szReserved[ 3 ];
    };
    这样子,不管你使用的是四字节对齐,还是单字节对齐都没有差异。
      

  4.   

    微软还是很注意这个问题的,基本上调用windows api需要使用packed的情况很少。通常microsoft定义的结构体当中,都会注意到这个问题,会为其添加reserved成员来补齐。
      

  5.   

    还是 不太明白:
    为什么#define RASDIALPARAMSA struct tagRASDIALPARAMSA
    RASDIALPARAMSA
    {
        DWORD dwSize;
        CHAR  szEntryName[ 256 + 1 ];
        CHAR  szPhoneNumber[ 128 + 1 ];
        CHAR  szCallbackNumber[ 128 + 1 ];
        CHAR  szUserName[ 256 + 1 ];
        CHAR  szPassword[ 256 + 1 ];
        CHAR  szDomain[ 15 + 1 ];
    };
    是 1052 ,而 :#define RASDIALPARAMSA struct tagRASDIALPARAMSA
    RASDIALPARAMSA
    {
    //    DWORD dwSize;
        CHAR  szEntryName[ 256 + 1 ];
        CHAR  szPhoneNumber[ 128 + 1 ];
        CHAR  szCallbackNumber[ 128 + 1 ];
        CHAR  szUserName[ 256 + 1 ];
        CHAR  szPassword[ 256 + 1 ];
        CHAR  szDomain[ 15 + 1 ];
    };是 1045 ??? 多了一个 DWORD ,为什么就要多 3位??
      

  6.   

    纯单字节结构体就是一段内存,换句话说,你这个结构体与
    char buff[256 + 1 + 128 +1 +128 +1 +256 +1 +256 +1 +15 +1];
    这样子的定义没有任何差别。
      

  7.   

    同样 Delphi 中:
      MyRec2=Record
        var1:integer;
        var2:array[0..6]of char;
      end;
    就是 12,而  MyRec2=Record
    //    var1:integer;
        var2:array[0..6]of char;
      end;
    就是 7.为什么 多了一个 integer 成员之后 ,结构体就需要对齐??
      

  8.   

    呃... 别这么说,只是使用windows api的过程当中的一个总结。
      

  9.   

    那为什么不能认为:#define RASDIALPARAMSA struct tagRASDIALPARAMSA
    RASDIALPARAMSA
    {
        DWORD dwSize;
        CHAR  szEntryName[ 256 + 1 ];
        CHAR  szPhoneNumber[ 128 + 1 ];
        CHAR  szCallbackNumber[ 128 + 1 ];
        CHAR  szUserName[ 256 + 1 ];
        CHAR  szPassword[ 256 + 1 ];
        CHAR  szDomain[ 15 + 1 ];
    };
    是 : char buff[4 + 256 + 1 + 128 +1 +128 +1 +256 +1 +256 +1 +15 +1];