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 *
有两个主要目的:
它清楚地说明了何时将指针用作通用指针。以前,您无法判断 char *
是用作指向实际字符缓冲区的指针还是用作通用指针。
它允许编译器在您尝试对通用指针取消引用或执行算术时捕获错误,而不是先将其转换为适当的类型。 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()) ...
代码的编译可能会完全不同。
C 的 void*
是否以编译器优化等形式提供了一些好处,或者它只是 char*
的惯用等价物? IE。如果 C 标准库中的每个 void*
都被 char*
替换,除了代码易读性之外,是否会损坏任何东西?
void *
之前,C 与 char *
作为通用指针类型相处得很好。所以这显然不是绝对必要的。但是编程语言是交流——不仅仅是告诉编译器做什么,而是告诉其他阅读程序的人想要做什么。任何使语言更具表现力的东西都是好东西。
在最初的 K&R C 中没有 void *
类型,char *
被用作通用指针。
void *
有两个主要目的:
它清楚地说明了何时将指针用作通用指针。以前,您无法判断
char *
是用作指向实际字符缓冲区的指针还是用作通用指针。它允许编译器在您尝试对通用指针取消引用或执行算术时捕获错误,而不是先将其转换为适当的类型。
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 bychar*
, would anything be damaged aside from code legibility?
C11 介绍 _Genric
。因此,根据 return 类型是否为 void *
、char *
、int *
等,_Generic(some_C_standard_library_function()) ...
代码的编译可能会完全不同。