【问题标题】:"parameter has incomplete type" warning“参数类型不完整”警告
【发布时间】:2011-08-25 04:54:22
【问题描述】:

我在 C 文件中有这个:

struct T
{
    int foo;
};

C 文件包含一个包含这些行的 h 文件:

typedef struct T T;
void listInsertFirst(T data, int key, LinkedList* ListToInsertTo);

函数listInsertFirst 是我收到警告的那个函数。我该如何解决?

【问题讨论】:

  • 谢谢,如果有人包含 h 文件,我希望知道类型怎么办?
  • 您应该注意的一件事是您在这里传递了struct 按值。这几乎肯定是个坏主意……
  • 在 C 文件中而不是在头文件中进行类型定义的任何原因。此外,您可以通过使用类似 struct T { int foo;} T;
  • 编译器指的是什么参数?
  • 我实际上不确定在实现(任何字典之类)时应该做的正确事情 DS:调用插入函数的人应该进行内存分配并传递指针,还是应该传递对象和插入函数应该做分配?

标签: c incomplete-type


【解决方案1】:
  1. 在头文件中定义struct T,而不是在.c文件中;
  2. 为结构和类型定义选择不同的名称。

【讨论】:

    【解决方案2】:

    正如我们在 cmets 中发现的,问题在于 struct T 的定义发生在标头中 T 的定义之后。你真的把事情倒退了。标头应该定义所有类型和函数原型,并且您的 C 文件应该使用它们。

    您想要做的是更改插入函数的签名以接收指向数据的指针和数据的大小。然后您可以为数据分配一些内存,复制并存储它。您不需要特定类型,只需将其声明为 void *

    void listInsertFirst(void *data, size_t data_size, int key, LinkedList* ListToInsertTo);
    

    然后调用者会做这样的事情:

    struct T { int foo; };
    struct T x = { ... };
    int someKey = ...;
    LinkedList *someList = ...;
    listInsertFirst(&x, sizeof x, someKey, someList);
    

    【讨论】:

      【解决方案3】:

      当您包含头文件时,编译器知道T 是一个未知大小的结构,并且listInsertFirst 想要一个作为它的第一个参数。但是编译器无法安排对listInsertFirst 的调用,因为它不知道要为T data 参数压栈多少字节,T 的大小仅在定义listInsertFirst 的文件中知道.

      最好的解决方案是更改listInsertFirst 以将T* 作为第一个参数,这样你的头文件就会这样写:

      extern void listInsertFirst(T *data, int key, LinkedList* ListToInsertTo);
      

      然后你会得到一个不透明的指针,用于 T 数据类型,并且由于所有指针的大小都相同(至少在现代世界中),编译器将知道在调用 listInsertFirst 时如何构建堆栈。

      【讨论】:

        【解决方案4】:

        尝试将结构定义移到 h 文件中,在 typedef 之前。

        【讨论】:

        • 这个问题是我有: typedef struct LinkedList { ListNode* head; ListNode* 尾; }链表;它使用类型“ListNode”,如果我将这个 typedef 结构放在 h 文件中,我必须添加“ListNode”的 typedef 结构,但没有人应该知道这种类型......
        • 但是LinkedList必须知道ListNode。因此,如果有人知道 LinkedList,那么它也必须知道 ListNOde。您还可以添加另一个 h 文件:将 ListNode 添加到新的 h 文件中,并将其包含在原始 h 文件中
        【解决方案5】:

        你确定是第一个参数有问题吗?可以肯定的是,尝试暂时将参数类型从T 更改为int。很可能,第三个参数实际上是问题所在。

        许多编译器并没有很好地指出这类问题中的问题。

        【讨论】:

          猜你喜欢
          • 2019-12-02
          • 2023-03-05
          • 2016-08-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多