C语言是否保证sizeof(long) == sizeof(void*)
?如果不是,为什么在Linux内核源代码中被广泛使用?
我查看了sizeof(int) == sizeof(void*)?,但它只讨论了sizeof(int)
和sizeof(void *)
的区别。
C语言是否保证sizeof(long) == sizeof(void*)
?如果不是,为什么在Linux内核源代码中被广泛使用?
我查看了sizeof(int) == sizeof(void*)?,但它只讨论了sizeof(int)
和sizeof(void *)
的区别。
sizeof(long) == sizeof(void *)
。
实际上,在Windows 64位系统中,sizeof(long)
的值为4
,sizeof(void *)
的值为8
。这种设计符合C标准。请参见What is the bit-size of long
on 64-bit Windows?。
那些实现Linux内核的人可能已经决定他们永远不会将代码移植到遵循Windows 64位LLP64(long long
和指针是64位量级)系统的系统上,因此不需要关心大小是否不同。32位系统(ILP32)和64位系统(LP64)都有sizeof(long) == sizeof(void *)
。但C标准并没有保证这一点。void *
和 char *
具有相同的大小和对齐方式;sizeof (const int *) == sizeof (int *)
);struct
指针类型具有相同的大小和对齐方式;union
指针类型具有相同的大小和对齐方式;sizeof (long) == sizeof (void *)
,那么他们已经决定限制他们要支持的平台。这完全没问题——你不必支持每个奇怪的架构。