OFFSETOF

#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
请按任意键继续. . .

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值