4

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

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

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

    fun(&var);
}

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

4

2 回答 2

4

出于对齐的原因,这个原型应该可以工作:

void fun(int *x);

而且当然:

void fun(void *x);

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

按要求编辑

6.7.2.1 - 15

一个指向结构对象的指针,经过适当的转换,指向它的初始成员(或者如果该成员是位域,则指向它所在的单元),反之亦然。结构对象中可能有未命名的填充,但不是在其开头。

于 2012-04-06T07:18:55.560 回答
1

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

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

这里要考虑的另一件事是结构打包,它依赖于编译器和平台。

于 2012-04-06T07:34:17.563 回答