编译时结构成员的类型
Type of a struct member at compile time
有没有办法在编译时知道结构成员的类型?类似于 offsetof()
的东西,但是对于类型。
例如。类似于:
typedef struct{
int b;
char c;
}a_t;
typeof(a_t,b) a_get_b(void* data){
return *(typeof(a_t,b)*)(data + offsetof(a_t,b));
}
另一种方式(除了 Jerry Jeremiah 的方式)是:
#define struct_get(STRUCT,ELEM) *(typeof(STRUCT.ELEM)*) (STRUCT+offsetof(typeof(STRUCT),ELEM))
如果您愿意使用 typeof
(这是目前非常常见的非标准 C 扩展,计划包含在下一版本的标准中),您可以将其应用于从化合物中获得的成员文字如 typeof((a_t){0}.b)
:
typedef struct{ int b; char c; }a_t;
typeof((a_t){0}.b) a_get_b(void* data){ return (a_t*){data}->b; }
(给定类型 a_t
,(a_t){0}
是获取其实例的可靠方法。由于 C 中的初始化工作方式,0 将初始化最深的第一个基本成员和基本成员类型是标量,因此可 0 初始化。)
关于从指向容器的void指针获取成员,你可以这样做:
*(typeof(&(a_t){0}.b)((char*)data + offsetof(a_t,b))
但这只是一个非常糟糕的 long-winded 方式:
(a_t*){data}->b
(只要data
的有效类型确实是a_t*
就100%等价于前者)
有没有办法在编译时知道结构成员的类型?类似于 offsetof()
的东西,但是对于类型。
例如。类似于:
typedef struct{
int b;
char c;
}a_t;
typeof(a_t,b) a_get_b(void* data){
return *(typeof(a_t,b)*)(data + offsetof(a_t,b));
}
另一种方式(除了 Jerry Jeremiah 的方式)是:
#define struct_get(STRUCT,ELEM) *(typeof(STRUCT.ELEM)*) (STRUCT+offsetof(typeof(STRUCT),ELEM))
如果您愿意使用 typeof
(这是目前非常常见的非标准 C 扩展,计划包含在下一版本的标准中),您可以将其应用于从化合物中获得的成员文字如 typeof((a_t){0}.b)
:
typedef struct{ int b; char c; }a_t;
typeof((a_t){0}.b) a_get_b(void* data){ return (a_t*){data}->b; }
(给定类型 a_t
,(a_t){0}
是获取其实例的可靠方法。由于 C 中的初始化工作方式,0 将初始化最深的第一个基本成员和基本成员类型是标量,因此可 0 初始化。)
关于从指向容器的void指针获取成员,你可以这样做:
*(typeof(&(a_t){0}.b)((char*)data + offsetof(a_t,b))
但这只是一个非常糟糕的 long-winded 方式:
(a_t*){data}->b
(只要data
的有效类型确实是a_t*
就100%等价于前者)