我希望有一个函数接受不同类型的结构作为参数.所以,由于我没有特定的类型,我必须使用void*.现在的问题是:当我将结构传递给此函数时,如何在函数内访问此结构的已知成员?具体来说,我知道所有结构都有str1作为成员,我想要,例如,打印它.这是一个示例代码:
struct {
char* str1;
float tt1; } var1 = {"This is me", 12};
struct {
char* str1;
int tt2; } var2 = {"This is you", 18};
void printStruct(void* str)
{
printf("\n the structure string is %s", ??);
//can I put something in ?? to print the string?
}
main(....)
{
printStruct(&var1);
printStruct(&var2);
}
Run Code Online (Sandbox Code Playgroud)
您可以传递函数指针以将函数与其用户分离
void printStruct(void* data, char * (*namef)(void *data)) {
printf("\n the structure string is %s", namef(data));
}
Run Code Online (Sandbox Code Playgroud)
然后假设您传递struct S1*给函数,您可以传递一个这样的getter:
char * whois(void *data) {
return ((struct S1*)data)->str1;
}
int main(void) {
struct S1 s = {"This is me", 12};
printStruct(&s, whois);
}
Run Code Online (Sandbox Code Playgroud)
offsetof尽管如此,你可以使用更加丑陋的替代品
void printStruct(void* data, size_t named) {
printf("\n the structure string is %s", *(char**) ((char*)data + named));
}
int main(void) {
struct S1 s = {"This is me", 12};
printStruct(&s, offsetof(struct S1, str1));
}
Run Code Online (Sandbox Code Playgroud)
offsetof是一个宏,它为您提供结构中成员的偏移量.在函数中,您将指针定位到char*成员(因此您必须转换char**为获取适当的类型)并获取成员值.
但是,我更喜欢使用函数的第一种方式.这样,print函数甚至不必知道data指向结构.它可以将它作为黑盒子移交给getter函数,在其中你可以让编译器为你处理低级偏移量计算.
小智 6
您可以将其转换为您想要的类型,然后访问该成员,例如,假设您有原型,请执行以下操作:
struct X
{
char* str1;
float tt1; } var1 = {"This is me", 12};
void printStruct(void* str)
{
((struct X *)str)->str1;
...
}
Run Code Online (Sandbox Code Playgroud)
注意使用括号; 所发生的是一个类型为void*到struct var2*的强制转换,这个类型在最外面的()括号内,可以作为该类型的变量进行访问.
| 归档时间: |
|
| 查看次数: |
4822 次 |
| 最近记录: |