2016-10-03 55 views
4

是否有任何簡單的方法將結構成員的名稱傳遞給C中的函數?例如,如果我要做到這一點:傳遞一個結構成員名稱以在C中運行?

(我知道的代碼是不正確的,我只是寫它來解釋這個問題)

struct Test 
{ 
    int x; 
    int y; 
}; 

int main() 
{ 
    struct Test t; 
    t.x = 5; 
    t.y = 10; 

    example(t, <MEMBER NAME>); 
} 

void example(struct Test t, <MEMBER NAME>) 
{ 
    printf("%d", t.<MEMBER NAME>); 
} 
+2

你可以使用成員[偏移](http://man7.org/linux/man-pages/man3/offsetof.3.html),而不是名稱。 – user2357112

+1

概念上與http://stackoverflow.com/q/13653024/2564301相同,對吧? – usr2564301

+0

您可以使用宏而不是函數。這對於一個更復雜的函數可能很快就會變得很奇怪,但爲了您的需要,您可以執行'#define example(x,member)printf(「%d \ n」,x.member)''。但這意味着你會失去類型安全(以及其他一些事情)。 – neoaggelos

回答

6

不知道這是你正在尋找什麼,但這裏是使用offsetof個八九不離十的解決方案:

struct Test 
{ 
    int x; 
    int y; 
}; 

void example(void *base, size_t offset) 
{ 
    int *adr; 
    adr = (int*)((char*)base + offset); 
    printf("%d\n", *adr); 
} 

int main(int argc, char **argv) 
{ 
    struct Test t; 

    t.x = 5; 
    t.y = 10; 

    example(&t, offsetof(struct Test, y)); 
} 
+2

請注意,只有GCC(和工作編譯器)允許您對'void *'進行算術運算。 C標準不允許這樣做。你需要這樣做:'int * adr =(int *)((char *)base + offset);'符合標準。 IIRC,海灣合作委員會將'如果你用'pedantic'刺激它會大發雷霆。 –

+0

編輯我的答案謝謝@JonathanLeffler。 – duncan