昨天在处理这个问题时,我发现了一个将未命名结构作为函数参数传递和接收的奇怪案例。
例如,如果我有这样的结构,
int main ()
{
struct {
int a;
} var;
fun(&var);
}
现在,原型应该fun
是什么?以及如何将该结构用作函数中的结构(指针)fun
?
昨天在处理这个问题时,我发现了一个将未命名结构作为函数参数传递和接收的奇怪案例。
例如,如果我有这样的结构,
int main ()
{
struct {
int a;
} var;
fun(&var);
}
现在,原型应该fun
是什么?以及如何将该结构用作函数中的结构(指针)fun
?
出于对齐的原因,这个原型应该可以工作:
void fun(int *x);
而且当然:
void fun(void *x);
我看不到在函数中有效地使用结构的简单方法;也许在该函数中再次声明它,然后分配void *
?
6.7.2.1 - 15
一个指向结构对象的指针,经过适当的转换,指向它的初始成员(或者如果该成员是位域,则指向它所在的单元),反之亦然。结构对象中可能有未命名的填充,但不是在其开头。
您也可以定义fun
为void fun(void* opaque);
。然而,这不被认为是一种好的做法,因为将参数声明为void*
将删除任何类型信息。您还需要解释传递的参数,因为您最终会得到一个指向字节序列的指针。您也必须以某种方式传递结构的大小。
这种做法在 WIN32 API 中很常见,您在结构中有一个字段来指定结构的大小(通常命名为 dwSize 或类似名称)。这也有助于传达有关结构定义版本的信息。
这里要考虑的另一件事是结构打包,它依赖于编译器和平台。