【问题标题】:How to receive unnamed structures as function parameters in C?如何在 C 中接收未命名的结构作为函数参数?
【发布时间】:2012-04-06 07:16:26
【问题描述】:

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

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

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

    fun(&var);
}

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

【问题讨论】:

  • 没有充分的理由这样做。一个struct 被传递(甚至作为指针)到某个函数真的应该被命名 和声明。保持匿名是不好的编码习惯。当然,您可以将您的函数声明为具有void* 形式参数。

标签: c struct function-prototypes function-parameter


【解决方案1】:

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

void fun(int *x);

当然还有:

void fun(void *x);

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

按要求编辑

6.7.2.1 - 15

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

【讨论】:

  • void * 应该没问题。但是为什么int*?它将在 C 中生成不兼容的指针类型警告,在 C++ 中生成错误。我不明白你的“调整原因”部分
  • @PavanManjunath 我为您添加了报价。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    相关资源
    最近更新 更多