【问题标题】:extern structs in C Error: array type has incomplete element typeC 错误中的外部结构:数组类型的元素类型不完整
【发布时间】:2021-02-09 20:08:59
【问题描述】:

我有两个文件,main.cother.h。我在main.c中声明了几个全局变量,大部分都可以。我可以在other.h 中说extern whatever 并访问这些变量。但是,我定义了一个这样的结构(在main.c):

struct LSA {
     int myID;
     int seqNum;
     int neighborID[256];
     int costs[256];
 } local_LSA[256];

当我尝试像这样在other.h 中访问它时

extern struct LSA local_LSA[256];

我收到此错误消息

other.h:27:19: error: array type has incomplete element type ‘struct LSA’
extern struct LSA local_LSA[256];

我已经玩了一段时间了,但是......我感谢任何人能够提供的任何帮助!

【问题讨论】:

    标签: c struct declaration definition incomplete-type


    【解决方案1】:

    根据 C 标准(6.7.6.2 数组声明符)

    1. ...元素类型不能是不完整或函数类型

    在文件other.h中的这个数组声明中

    extern struct LSA local_LSA[256];
    

    元素类型struct LSA是不完整类型,因为此时的结构定义是未知的。

    于是编译器发出相应的错误信息。

    other.h:27:19: error: array type has incomplete element type ‘struct LSA’
    extern struct LSA local_LSA[256];
    

    你需要将结构定义放在数组声明之前的头文件中。

    例如,您可以在头文件中写入other.h

    struct LSA {
         int myID;
         int seqNum;
         int neighborID[256];
         int costs[256];
     };
     
     extern struct LSA local_LSA[256];
    

    注意这条记录

     extern struct LSA local_LSA[256];
    

    是数组的声明而不是定义。

    然后在main.c 中,您可以再放置一个数组声明,例如

    struct LSA local_LSA[256];
    

    在这种情况下,数组的声明将生成所谓的数组的暂定定义。

    【讨论】:

    • 啊,我想我明白了,所以只需在other.h 中创建结构。它已经在main.c 中提供。
    【解决方案2】:

    头文件不知道struct LSA 的结构定义。你应该做的是在一些“lsa.h”中声明结构,然后在一些.c文件中定义和分配该类型的变量。

    请注意,您建议的设计是意大利面条式编程。 extern 的另一个文件不应该有任何理由访问 main.c 中的某个变量,这是您的程序的顶层 - 否则您的程序设计有缺陷。使用 setter/getter 函数代替意大利面条。

    【讨论】:

    • 谢谢!这是我第一次使用 .h 文件,所以我不是 100% 了解所有内容如何组合在一起,但我确实看到如果我只是在 other.h 中定义结构,我可以从 main.c 访问它.
    【解决方案3】:

    需要先定义结构类型,然后才能创建它的任何实例。

    您需要在定义local_LSA 之前将结构定义移动到other.h。

    【讨论】:

    • 我明白你在说什么......所以为了澄清起见,.h 文件中的内容将在 main.c 中的内容之前编译?
    • @ALittleHelpFromMyFriends 包含头文件时,头文件的内容会有效地粘贴到 .c 文件中#include 出现的位置。因此,如果在包含标头之前将结构定义放在 .c 中也可以,但是最好将结构放在标头中,因为标头需要它。
    猜你喜欢
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 2018-10-24
    • 1970-01-01
    相关资源
    最近更新 更多