2016-10-03 4 views
4

Есть ли какие-либо простые способы передать имя элемента struct функции в 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 (и компиляторы workalike) позволяют выполнять арифметику адресов на 'void *'. Стандарт C этого не допускает. Вам нужно будет сделать: 'int * adr = (int *) ((char *) base + offset);' стандартное соответствие. IIRC, GCC будет «испортить», если вы подталкиваете его «-педантиком». –

+0

Отредактировал свой ответ благодаря @JonathanLeffler. – duncan