我正试图正式理解这个概念。第13/1节说:
同一范围内的两个声明,声明相同的名称,但有 不同类型称为重载声明。 仅功能和 功能模板声明可以重载;变量和类型 声明不能超载。
这正式意味着,例如程序包含以下内容:
extern int a[5];
int a[6];
由于类型int[5]
和int[6]
不同,格式不正确。
现在考虑声明
extern int a[];
int a[6];
标准说3.9 / 6:
数组对象的声明类型可能是未知大小的数组 因此,在翻译单位的某一点上不完整 稍后完成; 这两个点的数组类型(“数组的数组 未知的T“和”N T“数组的界限是不同的类型。
但是,正如@MattMcNabb先前在comment中所述,这些声明声明了相同类型的变量。这是自然而合乎逻辑的,但标准中的含义并不明确。
答案 0 :(得分:0)
正如您所指出的,不允许以下内容:
extern int a[5];
int a[6];
无论如何,都有一个问题
extern int a[];
int a[6];
§3.5/ 10
在对类型进行所有调整(其中typedefs(7.1.3)被其定义替换之后),类型 由引用给定变量或函数的所有声明指定的应该是相同的,
除了声明之外 对于数组对象,可以指定由主数组的存在与否而不同的数组类型 约束(8.3.4)。违反此规则的类型标识不需要诊断。
这实际上是规则的例外。如果类型不同,这将不起作用
extern int arr[];
float arr[6];