#ifndef OFFSETOF
#define OFFSETOF(Type, member) ((unsigned long)&(((Type *)nullptr)->member))
#endif
#ifndef OFFSETOF
#define OFFSETOF(s,m) (WORD16)((size_t)&(((s *)1)->m) - (size_t)((s *)1))
#endif
#ifndef WIN32
#ifndef _PACKED_1_
#define _PACKED_1_ __attribute__ ((packed))
#endif
#else
#ifndef _PACKED_1_
#define _PACKED_1_
#endif
#endif
typedef struct
{
WORD32 dwSockfd;
BYTE protocol;
WORD16 dataLen;
BYTE data[0];
} _PACKED_1_ gInfo_T;
WORD16 beforeDataLen = (WORD16)OFFSETOF(gInfo_T, data);
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
typedef unsigned int WORD32;
typedef unsigned short WORD16;
typedef unsigned char BYTE;
#define OFFSETOF(s,m) (WORD16)((size_t)&(((s *)1)->m) - (size_t)((s *)1))
#ifndef OFFSETOF
#define OFFSETOF(Type, member) ((unsigned long)&(((Type *)nullptr)->member))
#endif
#ifndef OFFSETOF
#define OFFSETOF(s,m) (WORD16)((size_t)&(((s *)1)->m) - (size_t)((s *)1))
#endif
#ifndef WIN32
#ifndef _PACKED_1_
#define _PACKED_1_ __attribute__ ((packed))
#endif
#else
#ifndef _PACKED_1_
#define _PACKED_1_
#endif
#endif
typedef struct
{
BYTE a;
WORD16 b;
WORD16 c;
WORD16 data[0];
}gInfo_T;
int main()
{
WORD16 beforeDataLen = OFFSETOF(gInfo_T, data);
cout << beforeDataLen << endl <<sizeof (unsigned long) << endl;
system("pause");
return EXIT_SUCCESS;
}
运行结果:
6
4
请按任意键继续. . .
一字节对齐:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
typedef unsigned int WORD32;
typedef unsigned short WORD16;
typedef unsigned char BYTE;
#define OFFSETOF(s,m) (WORD16)((size_t)&(((s *)1)->m) - (size_t)((s *)1))
#ifndef OFFSETOF
#define OFFSETOF(Type, member) ((unsigned long)&(((Type *)nullptr)->member))
#endif
#ifndef OFFSETOF
#define OFFSETOF(s,m) (WORD16)((size_t)&(((s *)1)->m) - (size_t)((s *)1))
#endif
#ifndef WIN32
#ifndef _PACKED_1_
#define _PACKED_1_ __attribute__ ((packed)) //GCC中有效
#endif
#else
#ifndef _PACKED_1_
#define _PACKED_1_
#endif
#endif
#pragma pack(1) //VS2013 一字节对齐方法
typedef struct
{
BYTE a;
WORD16 b;
WORD16 c;
WORD16 data[0];
} gInfo_T;
int main()
{
WORD16 beforeDataLen = OFFSETOF(gInfo_T, data);
cout << beforeDataLen << endl <<sizeof (unsigned long) << endl;
system("pause");
return EXIT_SUCCESS;
}
5
4
请按任意键继续. . .