[英]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));
}
如果您願意使用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))
但這只是一種非常冗長的方法:
(a_t*){data}->b
(只要data
的有效類型確實是a_t*
,它就與前者 100% 等效)。
它的另一種工作方式:
#include <stdio.h>
#define typeof_element(_struct,el) typeof(((_struct *)(0))->el)
typedef struct{
int a;
int b;
}Row;
int main()
{
typeof_element(Row, a) value_a = 10;
printf("%d\n", value_a);
return 0;
}
另一種方式(除了傑里耶利米的)是:
#define struct_get(STRUCT,ELEM) *(typeof(STRUCT.ELEM)*) (STRUCT+offsetof(typeof(STRUCT),ELEM))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.