2016-10-03 2 views
4

구조체 멤버의 이름을 C의 함수에 전달하는 간단한 방법이 있습니까? 내가 만들고 싶어 예를 들어 이런 일이 :구조체 멤버 NAME을 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, GCC는 '페데 넌 틱스'로 프로듀싱한다면 그것을 속일 것이다. –

+0

내 대답을 편집했습니다. 감사합니다. @JonathanLeffler. – duncan