对完整类型概念的形式化理解

Formal understanding of the complete type concept

本文关键字:形式化 类型      更新时间:2023-10-16

我正试图正式理解这个概念。第13/1条规定:

同一范围内的两个声明,声明相同的名称,但具有不同的类型称为重载声明仅功能函数模板声明可以重载;变量和类型声明不能重载。

这在形式上意味着,例如,程序包含以下内容:

extern int a[5];
int a[6];

由于类型CCD_ 1和CCD_。

现在考虑申报

extern int a[];
int a[6];

标准规定3.9/6:

数组对象的声明类型可能是未知大小的数组因此在翻译单元中的某一点上是不完整的,并且稍后完成这两点上的数组类型("array ofT的未知界"answers"NT的数组")是不同的类型

但是,正如@MattMcNabb早些时候在评论中所说,这些声明声明了相同类型的变量。这是自然和合乎逻辑的,但《标准》在其中的含义尚不清楚。

正如您所指出的,以下是不允许的:

extern int a[5];
int a[6];

不管怎样,有一个陷阱

extern int a[];
int a[6];

§3.5/10

在对类型进行所有调整之后(在此期间,typedef(7.1.3)被其定义所取代)所有引用给定变量或函数的声明所指定的应相同,除了声明对于数组对象,可以指定因主数组的存在或不存在而不同的数组类型绑定(8.3.4)。违反此类型标识规则不需要诊断。

这实际上是一个例外。如果类型不同,这将不起作用

extern int arr[];
float arr[6];