C是否保证sizeof(long) == sizeof(void*)
?如果没有,为什么它在Linux内核源代码中被如此广泛地使用?
我看了sizeof(int(==sizeof(void*(?但这涉及到CCD_ 2与CCD_。
否,C标准不保证sizeof(long) == sizeof(void *)
。
实际上,在Windows 64位系统上,sizeof(long)
的值为4
,sizeof(void *)
的值为8
。这种设计符合C标准。另请参阅64位Windows上long
的位大小是多少?
那些实现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
指针类型都具有相同的大小和对齐方式
就是这样。
如果Linux内核开发人员正在编写假设sizeof (long) == sizeof (void *)
的代码,那么他们已经决定限制他们将支持的平台。这是绝对好的-你不必支持所有奇怪的架构。