昨天在通过this问题时,我发现了一个奇怪的案例,即传递和接收未命名的结构作为函数参数。
例如,如果我有这样的结构,
int main ()
{
struct {
int a;
} var;
fun(&var);
}
现在,fun
的原型应该是什么?我如何在函数fun
中将该结构用作结构(指针)?
答案 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,它依赖于编译器和平台。