我有一个接受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文件中声明结构。
答案 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}}与extern
和typedef
与struct tag
匹配。
在实现代码(或实现头文件中,如果您有多个源文件实现对该类型的支持),您可以包含公共头文件并定义结构类型:
struct struct1
{
…private details…
};
在C11及更高版本中,您可以重复typedef
,只要它指的是同一类型;在早期版本的C中,你不能这样做。
这种方法的优点是客户端代码被迫使用您的功能,因为他们不了解结构的内部,但他们得到了类型安全的度量。特别是,随机结构指针不能传递给该函数。如果所有内容都需要void *
,那么您可以将错误的结构类型传递给函数,因为所有void
指针看起来都相似。这既不仁慈也不必要。