簡體   English   中英

編譯時結構成員的類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM