编译时结构成员的类型

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%等价于前者)