C: 不完整的返回类型

3

我尝试在C语言中实现链表,并从这个简单的代码开始:

#include <stdio.h>

struct int_node;
struct int_list;
struct int_list create_list();

int main() {

    struct int_list list = create_list();
    return 0;
}

struct int_node {
    int value;
    struct int_node * next;
};

struct int_list {
    struct int_node * first;
};

struct int_list create_list() {
    /* Creates an empty list, first node=null */
    struct int_list list;
    list.first = NULL;
    return list;
};

在构建过程中,我遇到了两个错误:

  1. 使用不完整的返回类型“struct int_list”调用'create_list'
  2. 变量具有不完整的类型“struct int_list”

我查找了答案,但我只能发现我需要在使用它们之前声明结构体和函数,我已经这样做了。

我尝试的另一件事是将main()函数移动到末尾,这解决了错误,但这是一个愚蠢的解决方法,我想找到真正的解决方案。

有什么帮助吗?


C语言的设计允许一次性编译。在声明对象的时候,类型必须是完整的,而你在main函数中的结构体声明并不完整。即使稍后完成了类型,也无济于事。 - mafso
1
(无关)您是否意识到在create_list中返回了一个局部变量? - Jongware
@Jongware 是的,我后来修复了这个问题 - 谢谢! - Matan
移除结构体声明的前向声明。将实际的结构体声明移到 main() 函数之前。 - user3629249
2个回答

6
结构体的定义也应该放在main()之前。也就是说,你的愚蠢修复实际上才是正确的修复方法。

谢谢!它总是这样吗?(抱歉如果这听起来像个愚蠢的问题,我刚开始学习C) - Matan
@MatanAbudy:一般来说,有些情况下前向声明就足够了,但现在可能不需要过多担心这个问题。 - Bill Lynch
是的,总是这样。在良好的C源代码中,代码位于底部(在“struct”、“typedef”等定义之后...) - Basile Starynkevitch
通常情况下,我总是尝试将结构体定义放在文件中的所有其他内容之前(除了#include)。我发现这比将它们分散在整个代码中更容易阅读,并且可以避免出现错误。 - MichaelPlante
那么,如果我在所有其他内容之前定义了结构体,是否需要声明? - Matan
正确。它们在这里不必要。 - Bill Lynch

1
实际上,在使用结构体之前,您需要先定义它们,否则编译器在主方法中看到struct int_node时将不知道其含义。因此,正如Bill Lynch所说,您的简单修复实际上只是正确的方法。
如果您有兴趣了解更多,请查看C程序从源代码到可执行文件的详细过程。这里是一个有趣而不太长的页面。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接