2016-10-03 2 views
4

Cの関数に構造体メンバの名前を渡す簡単な方法はありますか?私がしたい場合たとえば、この現象が発生:Cで構造メンバーNAMEを機能させるには?

(私はちょうど質問を説明するためにそれを書いた、コードが間違っている知っている)

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

ではなく:ここoffsetofを使用してかなり近いソリューションです名。 – user2357112

+1

概念的にはhttp://stackoverflow.com/q/13653024/2564301と同じですか? – usr2564301

+0

関数の代わりにマクロを使用できます。これは、より複雑な関数のためにすばやく不思議になるかもしれませんが、必要に応じて '#define example(x、member)printf("%d \ n "、x.member)'を実行できます。しかし、これは、型の安全性(および他のもの)を失うことを意味します。 – neoaggelos

答えて

6

これがあるかどうかわからない、まさにあなたが探しているが、 (http://man7.org/linux/man-pages/man3/offsetof.3.html)[オフセット]

あなたはメンバーを使用することができ
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はあなたが '-pedantic'でそれを知っていれば気をつけます。 –

+0

私の答えは@ JonathanLefflerに感謝しました。 – duncan

関連する問題