2

当然int并且long保证是相同的类型,但是在 Windows 等平台上,在 32 位模式下编译时它们恰好大小相同,编译器是否允许将它们视为相同类型?

我不确定如何明确测试编译器是否将两种类型视为相同,但我尝试了启发式测试,int *a; long *b = a;微软编译器毫无怨言地接受了这一点,而 GCC 则发出警告。是编译器行为不正确还是依赖于实现,它们是命名两种不同的类型还是只命名一种?

4

2 回答 2

5

标准(C2011标准的N1570草案)在6.2.5(4)中说:

有五种标准有符号整数类型,分别指定为signed charshort intintlong intlong long int。(这些和其他类型可以用几种额外的方式指定,如 6.7.2 中所述。)也可能存在实现定义的扩展有符号整数类型。标准和扩展的有符号整数类型统称为有符号整数类型。

在同一节的第 14 段中:

type char、有符号和无符号整数类型以及浮点类型统称为基本类型。基本类型是完整的对象类型。即使实现定义了两个或多个基本类型以具有相同的表示,它们仍然是不同的类型。

所以这说明intand long(另一种指定方式long int)是不同的类型。它们可能具有相同的表示、行为和对齐要求,但就语言而言,它们的类型不同。

于 2013-02-14T12:22:02.147 回答
3

好的,C99 标准在第6.5.6 节类型中说:

有五种标准有符号整数类型,指定为signed charshort intintlong intlong long int。(这些和其他类型可以用几种额外的方式指定,如 6.7.2 中所述。)也可能存在实现定义的 扩展有符号整数类型。标准和扩展的有符号整数类型统称为有符号整数类型

此外:

char类型、有符号和无符号整数类型以及浮点类型统称为基本类型。即使实现定义了两个或多个基本类型以具有相同的表示,它们仍然是不同的类型。

这清楚地表明它们必须是不同的类型,即使在没有模板、函数重载的 C 中,typeid它可能不像在 C++ 中那样实际重要,在C++中,这些类型是相同的类型肯定会破坏很多代码。

编辑:事实上,由于C中类型独特性的实际相关性较小,并且缺少上述语言特性,我无法想出一种可靠的方法来立即测试两种类型的绝对独特性。

于 2013-02-14T12:24:34.890 回答