【发布时间】:2013-11-08 05:20:36
【问题描述】:
使用 OFFSETOF 宏更新结构字段的代码
#include <stdio.h>
#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))
typedef struct PodTag {
int i;
double d;
char c;
}PodType;
#pragma pack(1)
int main()
{
char arr[20] = {'\0'};
arr[0] = 0x1;
PodType instance;
printf("%d\n", OFFSETOF(PodType, c));
memset(&instance,0,sizeof(PodType));
memcpy(&instance+OFFSETOF(PodType, c),&arr[0],sizeof(char));
printf("Val of C = %d\n",instance.c); // value is not reflected
getchar();
return 0;
}
我在这里做 memcpy 。价值不体现。怎么了
memcpy(&instance+OFFSETOF(PodType, c),&arr[0],sizeof(unsigned char));
我们可以做这样的事情来更新结构字段
#define OFFSETOF_DATA(TYPE, ELEMENT,data) \
(*((size_t)&(((TYPE *)0)->ELEMENT)) = (unsigned char)(data))
【问题讨论】:
-
当标准版本的
offseof可以从标准库的头文件stddef.h中获得时,为什么要编写自己的OFFSETOF宏? -
你为什么要使用
offsetof宏,而你只能使用&instance.c?