如何在C中接收未命名的结构作为函数参数?

时间:2012-04-06 07:16:26

标签: c struct function-prototypes function-parameter

昨天在通过this问题时,我发现了一个奇怪的案例,即传递和接收未命名的结构作为函数参数。

例如,如果我有这样的结构,

int main ()
{
    struct {
        int a;
    } var;

    fun(&var);
}

现在,fun的原型应该是什么?我如何在函数fun中将该结构用作结构(指针)

2 个答案:

答案 0 :(得分:4)

出于对齐的原因,这个原型应该有效:

void fun(int *x);

当然:

void fun(void *x);

我没有看到在函数中有效实际使用结构的简单方法;或许在该函数内再次声明它,然后分配void *

按要求编辑

  

6.7.2.1 - 15

     

指向适当转换的结构对象的指针指向它   初始成员(或者如果该成员是一个位字段,那么到该单位)   它居住的地方),反之亦然。可能有未命名的填充   在结构对象中,但不是在它的开头。

答案 1 :(得分:1)

您还可以将fun定义为void fun(void* opaque);。然而,这不是一个好的做法,因为声明参数void*将删除任何类型信息。您还需要解释传递的参数,因为最终会得到一个指向字节序列的指针。你也必须以某种方式传递结构的大小。

这种做法在WIN32 API中很常见,在结构中有一个字段,用于指定结构的大小(通常名为dwSize或类似名称)。这也有助于传达有关结构定义版本的信息。

这里要考虑的另一件事是structure packing,它依赖于编译器和平台。