2016-10-03 7 views
4

Gibt es eine einfache Möglichkeit, den Namen eines Strukturelements an eine Funktion in C übergeben? Zum Beispiel, wenn ich dies verwirklichen will:Übergeben Sie ein Strukturelement NAME, um in C zu funktionieren?

(ich weiß, der Code falsch ist, ich es einfach geschrieben, die Frage zu erklären)

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

Sie das Element verwenden könnte [offset] (http://man7.org/linux/man-pages/man3/offsetof.3.html), aber nicht die Name. – user2357112

+1

Konzeptionell das gleiche wie http://StackOverflow.com/q/13653024/2564301, richtig? – usr2564301

+0

Sie könnten ein Makro anstelle einer Funktion verwenden. Dies könnte für eine komplexere Funktion schnell komisch werden, aber für Ihre Bedürfnisse könnten Sie '#define example (x, member) printf ("% d \ n ", x.member)' verwenden. Aber das bedeutet, dass Sie die Typsicherheit (und einige andere Dinge) verlieren. – neoaggelos

Antwort

6

nicht sicher, ob dies ist genau das, was Sie suchen, aber hier ist eine ziemlich enge Lösung mit 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

Beachten Sie, dass nur GCC (und Workalike-Compiler) Ihnen erlauben, Adressarithmetik auf 'void *' zu tun. Der C-Standard erlaubt das nicht. Sie müssten folgendes tun: 'int * adr = (int *) ((char *) base + offset);' standardkonform sein. IIRC, GCC wird sich bemühen, wenn Sie es mit "pedantic" prodizieren. –

+0

Bearbeitete meine Antwort dank @ JonathanLeffler. – duncan

Verwandte Themen