将struct作为参数传递代替void *

时间:2016-01-16 20:37:50

标签: c function struct void-pointers

我有一个接受void *作为参数的函数,但我想使用它就好像它是一个结构。

typedef struct struct1
{
    int val;
} struct2;

void func1(void* struct3)
{
    printf("%d",struct3->val);
}

我的目的是,例如,如果我有一个.h文件,其中函数被定义为

typedef void* parameter1;
void func1(parameter1 p1);

我想在该函数中使用struct作为参数,而不在.h文件中声明结构。

2 个答案:

答案 0 :(得分:1)

感谢@ i486提到的答案printf("%d",((struct2 *)struct3)->val),这就是我所寻求的。

答案 1 :(得分:0)

在标题中,将结构类型声明为不完整类型。例如:

typedef struct struct1 struct1;
extern void func1(struct1 *p1);

或者:

struct struct1;
void func1(struct struct1 *p1);

您可以混合“{1}}与externtypedefstruct tag匹配。

在实现代码(或实现头文件中,如果您有多个源文件实现对该类型的支持),您可以包含公共头文件并定义结构类型:

struct struct1
{
    …private details…
};

在C11及更高版本中,您可以重复typedef,只要它指的是同一类型;在早期版本的C中,你不能这样做。

这种方法的优点是客户端代码被迫使用您的功能,因为他们不了解结构的内部,但他们得到了类型安全的度量。特别是,随机结构指针不能传递给该函数。如果所有内容都需要void *,那么您可以将错误的结构类型传递给函数,因为所有void指针看起来都相似。这既不仁慈也不必要。