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