C 的 void* 除了让代码更地道之外还有其他用途吗?

Does C's void* serve any purpose other than making code more idiomatic?

C 的 void* 是否以编译器优化等形式提供了一些好处,或者它只是 char* 的惯用等价物? IE。如果 C 标准库中的每个 void* 都被 char* 替换,除了代码易读性之外,是否会损坏任何东西?

在后来引入 void * 之前,

C 与 char * 作为通用指针类型相处得很好。所以这显然不是绝对必要的。但是编程语言是交流——不仅仅是告诉编译器做什么,而是告诉其他阅读程序的人想要做什么。任何使语言更具表现力的东西都是好东西。

在最初的 K&R C 中没有 void * 类型,char * 被用作通用指针。

void * 有两个主要目的:

  1. 它清楚地说明了何时将指针用作通用指针。以前,您无法判断 char * 是用作指向实际字符缓冲区的指针还是用作通用指针。

  2. 它允许编译器在您尝试对通用指针取消引用或执行算术时捕获错误,而不是先将其转换为适当的类型。 void * 值不允许这些操作。不幸的是,某些编译器(例如 gcc)默认允许对 void * 指针进行算术运算,因此它并不像它应该的那样安全。

Does C's void* serve any purpose other than making code more idiomatic?

if every void* in the C standard library was replaced by char*, would anything be damaged aside from code legibility?

C11 介绍 _Genric。因此,根据 return 类型是否为 void *char *int * 等,_Generic(some_C_standard_library_function()) ... 代码的编译可能会完全不同。