正如 Bart van Ingen Schenau 所说,我认为标准化委员会希望尽可能少地限制指针的表示。从编译器的角度来看,对 and 有一个不同的表示是很有用的int *
,int const *
因为常量可以放在更大或更小的内存中,因此可以使用更小的指针指向更小的内存。然而,这意味着%s
格式说明符printf
应该有两个版本,一个用于常量字符串,一个用于非常量字符串。这会破坏很多遗留代码,我的猜测是标准化委员会缺乏将其强制执行到社区的勇气。可能是正确的。由于没有令人信服的理由为 and 强制执行相同的表示int **
,int const **
他们就这样离开了。然而,为这些指针使用不同的表示几乎没有用处,除非可能用于某些极端情况应用程序。
他们也可能已经决定只有 char *
并且char const *
应该具有相同的表示,只是为了 save %s
,但也许还有一些其他接口也要求指向其他原始类型的指针相等。
类似地,在某些系统上,希望对全局内存中的某些内容、堆栈上的某些内容和堆中的某些内容具有不同的指针表示。然而,在 C 中可以使用指针,它可以包含这样的指针(你可以再次想到可变参数),因此至少需要一个可以表示所有指针的指针表示。
在 C 内存空间上的 Embedded-C 扩展中引入了显式允许程序员从不同的数据总线获取数据,而无需可以表示所有数据的指针类型。这样的内存空间也可以用于为常量、堆等指定专用内存。从而允许更有效的指针表示。
我的一位同事还提到,仍然允许使用 K&R 原型,或者更好的是没有原型。在这种情况下,编译器无法检测到参数声明和使用之间的表示差异。这无疑会导致遗留软件中许多未被发现的问题。这些问题可以通过要求在参数传递(包括可变参数)上使用通用表示来解决,例如在可变参数中为float
todouble
所做的,但这也会损害不同表示的预期效率。