C' void*
是否以编译器优化等形式提供了一些好处,或者它只是char*
的惯用等价物?即如果C标准库中的每个void*
都被char*
替换,那么除了代码易读性之外是否会损坏任何内容?
答案 0 :(得分:5)
在原始K& R C中没有void *
类型,char *
被用作通用指针。
void *
有两个主要目的:
当指针被用作通用指针时,它就清楚了。以前,您无法判断char *
是否被用作指向实际字符缓冲区的指针或作为通用指针。
它允许编译器在尝试取消引用或对泛型指针执行算术时捕获错误,而不是先将其强制转换为适当的类型。 void *
值不允许执行这些操作。不幸的是,一些编译器(例如gcc
)默认允许对void *
指针进行算术运算,因此它不是那么安全。
答案 1 :(得分:3)
C与char *
之后的void *
之前的>>nano wynik.txt
作为通用指针类型相处得很好。所以显然不是绝对必要的。但编程语言是沟通 - 不仅告诉编译器要做什么,而且告诉其他人阅读程序的目的。任何让语言更具表现力的东西都是好事。
答案 2 :(得分:1)
除了使代码更具惯用性之外,C的无效*是否有任何其他目的?
如果C标准库中的每个
void*
都被char*
替换,除了代码清晰度之外是否会损坏任何内容?
C11介绍_Genric
。因此,_Generic(some_C_standard_library_function()) ...
代码的编译方式会有很大不同,具体取决于返回类型是void *
,char *
,int *
等等。