【问题标题】:Array type has incomplete element type when define new data type定义新数据类型时,数组类型的元素类型不完整
【发布时间】:2017-02-08 17:42:27
【问题描述】:

我有以下代码:

#include <stdio.h>

int main(void) {
    typedef int new_type[];
    new_type Number[8];
    return 0;
}

编译器 (Gcc- 4.9.2) 显示错误:数组类型的元素类型不完整
我有一些问题:
1、new_type通过typedef定义的C90标准是否接受?在这种情况下,new_type 是一种数据类型,它定义了一个数组,其中包含未定义的元素数量或一个指针 指向int 的数组?
2.如果我们保留typedef int new_type[];这一行,我们如何定义new_type类型的变量? 感谢您的帮助。

【问题讨论】:

  • Number 应该有多大?它有 8 个元素,但这些元素是大小不定的数组。无法分配。
  • 注意:typedef 在本地范围内不是很有用,而未确定大小的数组-typedef 有什么用途非常值得怀疑。
  • 为什么不使用typedef int my_int; my_int a[8];? (在文件范围内有typedef)。

标签: c c89


【解决方案1】:

C90标准接受通过typedef定义new_type吗?在这种情况下,new_type 是一种数据类型,它定义了一个未定义元素数的数组或一个指向 int 数组的指针?

typedef 本身不是问题,因为您可以 typedef 不完整的类型 (typedef struct A A_s;)。 new_type 确实和你想象的差不多。

如果我们保留typedef int new_type[]; 这一行,我们如何定义一个new_type 类型的变量?

对于变量定义,变量的类型必须是完整类型,所以:

typedef int new_type[];
new_type Number = { 1, 2, 3 };

将导致 Number 成为大小为 3 的 int 数组。但是,您尝试将 Number 定义为大小为 8 的 int[] 数组 (int Number[8][];)。

但未指定大小的数组不能用于定义任何变量、数组或作为结构的成员1(不能将不完整的类型用于这些目的)。


1. 除非是最后一个,灵活的数组成员是允许的(有很多限制)。

【讨论】:

  • 但是如果我把它改成new_type Number={0}; 它构建成功但是编译器如何知道'Number'的实际大小?
  • @TonyJ - 因为您提供了一个数组初始值设定项 ({0})。它有 1 个元素 (0),因此大小可以推导出为 1。
猜你喜欢
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
  • 2018-10-24
  • 2012-04-17
  • 1970-01-01
相关资源
最近更新 更多