【发布时间】:2013-02-14 12:10:08
【问题描述】:
当然,int 和 long 不保证是同一类型,而是在 Windows 等平台上以 32 位模式编译时它们恰好大小相同,编译器是否允许将它们视为同一类型?
我不确定如何明确测试编译器是否将两种类型视为相同,但我尝试使用int *a; long *b = a; 进行启发式测试,Microsoft 编译器毫无怨言地接受了这一点,而 GCC 则发出警告。是编译器行为不正确,还是依赖于实现,它们是命名两种不同的类型还是只命名一种?
【问题讨论】:
-
指向数据的指针往往具有same size regardless of their type,这可能就是您可以将一个分配给另一个的原因。我猜 MS 编译器只是没有给你警告。
-
为了澄清,微软编译器确实警告 int *a;字符 *b = a;
-
从技术上讲,它们不是“同一类型”,但根据 ABI 定义,它们的大小确实相同。我还猜测有足够多的地方编写了一些代码,因为知道
int和long的大小相同,以至于来自 MS 编译器的警告对于 MS 内部开发人员来说是非常烦人的。 -
绝对不是(尽管我把它留给了一个答案,以便在标准中挖掘它)。好的,在 C 中,它既没有函数重载也没有
typeid,不过,我不知道如何轻松地检查这一点。但我也猜你的支票不是那么可靠。 -
将这种行为与 c++ 进行比较很有趣——在 c++ 中,它们当然不应该是相同的类型,并且赋值会出错。对于 C,您可以将 void* 分配给任何指针类型。所以不确定这里的规则。从 c++ 中函数重载的角度来看,long 不应与 int 类型相同(在 C 中不是问题)。
标签: c