以下代码无法编译:
int main() {
int a[][] = { { 0, 1 },
{ 2, 3 } };
}
产生的错误消息是
error: declaration of 'a' as multidimensional array must have bounds for all dimensions except the first
int a[][] = { { 0, 1 },
^
标准有规定吗?如果是这样,那是为什么呢?我认为在这里推断界限会很容易。
标准有规定吗?
嗯,是的。
§8.3.4/3 当多个规范“数组”相邻时,
创建多维数组类型;仅常数的第一个
指定数组边界的表达式可以被省略。在
除了不完整对象类型的声明之外
允许,在某些情况下可以省略数组边界
函数参数的声明 (8.3.5)。数组边界也可以
当声明符后面跟着一个时被省略初始化器(8.5)。
在这种情况下,界限是根据初始数量计算的
元素(例如,N
)提供(8.5.1),以及标识符的类型
的D
是“数组N
T
”。此外,如果前面有
在绑定所在的同一范围内声明实体
指定时,省略的数组边界被视为与其中相同
较早的声明,静态数据的定义也类似
班级成员。
如果是这样,那是为什么呢?
一方面,不能从不完整的类型构造数组(void
例如)。未知边界的数组是不完整类型之一:
§8.3.4/1 ...数组类型的对象包含连续分配的
非空集合N
类型的子对象T
。除下述情况外,如果
省略常量表达式,标识符的类型D
is “ 派生声明符类型列表未知边界的数组T
“, 一个
不完整的对象类型。 ...
§8.3.4/2 数组可以由基本类型之一构造而成
(除了void
)、从指针、从指向成员的指针、从
类、枚举类型或另一个数组。
此外:
§3.9 A class that has been declared but not defined, an enumeration
type in certain contexts (7.2), or an array of unknown size or of
incomplete element type, is an incompletely-defined object
type.45 ...
45) The size and layout of an instance of an incompletely-defined
object type is unknown.
我认为在这里推断界限会很容易。
初学者常犯的一个错误是,编译器具有神奇的力量。编译器使用它的信息来工作already有,没有create凭空而来的信息。如果你要求它创建一个未知大小的对象,它根本无法做到这一点。请参阅以下示例:
仅最里面的尺寸可以省略。中元素的大小
根据给定数组变量的类型推导数组。这
因此,元素类型必须具有已知的大小。
-
char a[] = { ... };
有元素(例如a[0]
) of size1(8 位),大小未知。
-
char a[6] = { ... };
有元素of size1,尺寸为 6。
-
char a[][6] = { ... };
有元素(例如a[0]
,这是一个数组)of size6、尺寸未知。
-
char a[10][6] = { ... };
有元素of size6. 尺寸为 60。
不允许:
-
char a[10][] = { ... };
将有 10 个元素大小未知.
-
char a[][] = { ... };
将有未知数量的元素大小未知.
Source https://stackoverflow.com/a/7433226
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)