当然int
并且long
不保证是相同的类型,但是在 Windows 等平台上,在 32 位模式下编译时它们恰好大小相同,编译器是否允许将它们视为相同类型?
我不确定如何明确测试编译器是否将两种类型视为相同,但我尝试了启发式测试,int *a; long *b = a;
微软编译器毫无怨言地接受了这一点,而 GCC 则发出警告。是编译器行为不正确还是依赖于实现,它们是命名两种不同的类型还是只命名一种?
当然int
并且long
不保证是相同的类型,但是在 Windows 等平台上,在 32 位模式下编译时它们恰好大小相同,编译器是否允许将它们视为相同类型?
我不确定如何明确测试编译器是否将两种类型视为相同,但我尝试了启发式测试,int *a; long *b = a;
微软编译器毫无怨言地接受了这一点,而 GCC 则发出警告。是编译器行为不正确还是依赖于实现,它们是命名两种不同的类型还是只命名一种?
标准(C2011标准的N1570草案)在6.2.5(4)中说:
有五种标准有符号整数类型,分别指定为
signed char
、short int
、int
、long int
和long long int
。(这些和其他类型可以用几种额外的方式指定,如 6.7.2 中所述。)也可能存在实现定义的扩展有符号整数类型。标准和扩展的有符号整数类型统称为有符号整数类型。
在同一节的第 14 段中:
type
char
、有符号和无符号整数类型以及浮点类型统称为基本类型。基本类型是完整的对象类型。即使实现定义了两个或多个基本类型以具有相同的表示,它们仍然是不同的类型。
所以这说明int
and long
(另一种指定方式long int
)是不同的类型。它们可能具有相同的表示、行为和对齐要求,但就语言而言,它们的类型不同。
好的,C99 标准在第6.5.6 节类型中说:
有五种标准有符号整数类型,指定为signed char、short int、int、long int和long long int。(这些和其他类型可以用几种额外的方式指定,如 6.7.2 中所述。)也可能存在实现定义的 扩展有符号整数类型。标准和扩展的有符号整数类型统称为有符号整数类型。
此外:
char类型、有符号和无符号整数类型以及浮点类型统称为基本类型。即使实现定义了两个或多个基本类型以具有相同的表示,它们仍然是不同的类型。
这清楚地表明它们必须是不同的类型,即使在没有模板、函数重载的 C 中,typeid
它可能不像在 C++ 中那样实际重要,在C++中,这些类型是相同的类型肯定会破坏很多代码。
编辑:事实上,由于C中类型独特性的实际相关性较小,并且缺少上述语言特性,我无法想出一种可靠的方法来立即测试两种类型的绝对独特性。