【问题标题】:Header file error: incomplete type is not allowed头文件错误:不允许不完整的类型
【发布时间】:2013-04-12 15:34:48
【问题描述】:

这是我的头文件:

typedef int* Arg;   
typedef int* Args[];
typedef int** ArgsList[];

typedef int (*ProcessStart)(Args);

typedef struct PCBEntry{

    ProcessStart proc;
    Args args;
    int pid;
    int curr_proc;
    int sched_info;
    int pc;

} PCBEntry;

我在结构中的Args argsline 上收到错误,我不知道为什么。

【问题讨论】:

    标签: c struct header-files keil


    【解决方案1】:

    因为您将Args 定义为int *[],所以成员args 被有效地声明为

    int *args[];
    

    这是一个灵活的数组成员,它们只允许在结构的末尾。

    如果您的意思是暗示Args 是一个指针(与char **argv 相同),请将其声明为指针:

    typedef int **Args;
    

    【讨论】:

    • “你不能把一个“可变大小的数组”放在一个结构中”——除非你有一个 C99 编译器并且你把可变大小的数组放在结构的末尾。
    • @H2CO3 严格来说,灵活数组成员不是变长数组。您不能将 VLA 放入结构中。
    • 您建议将Args 从数组类型更改为指针类型。这可能是一个很好的解决方案,但对结构来说是一个很大的变化。
    • Args 不是 VLA 类型。 VLA 具有指定的非常量大小; Args 根本没有指定的大小。
    • 感谢大家的cmets;为了更清楚,我重写了答案。
    【解决方案2】:

    而不是使用

    typedef int* Args[];
    

    在你的结构声明中

    Args args;
    

    您最好只使用第一种类型进行结构声明...

    Arg args[];
    

    说实话,我什至不确定第一个是合法的 typedef,但只是我以前从未用 typedef 做过类似的事情。我的直觉告诉我这是不合法的,因此 Args 是未定义的,因此您会遇到错误。如果我对此应用左右规则,那么Args 是一个指向 int 的指针数组的类型......所以,也许它是合法的,但它在我看来确实很有趣。

    【讨论】:

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