Ada*_*ton 84 c free casting legacy-code void
我正在阅读一本使用 C的书(Butenhof 的POSIX 线程编程,1997 年),我遇到了以下行:
(void)free(data);
Run Code Online (Sandbox Code Playgroud)
这里,data只是一个指向已分配结构的指针,
data = malloc(sizeof(my_struct_t));
Run Code Online (Sandbox Code Playgroud)
为什么是free被强制转换的结果void?
根据我对 C 的理解,这似乎没有意义,原因有两个:
void这本书写于 1997 年。这是某种遗产吗?
作者提到这些示例是在 Digital Unix 4.0d 上运行的,但如果您不打算使用该结果,我仍然无法想象有理由强制转换该函数的结果。
Eug*_*Sh. 102
如果我们谈论的是标准free函数,那么它的原型是
void free(void *ptr);
Run Code Online (Sandbox Code Playgroud)
因此演员表完全没用。
现在有些猜测。
作者可能忘记包含stdlib.h声明这个原型的头文件,所以编译器假设它的返回类型为int. 现在,在此代码的静态分析期间,编译器警告它认为是非void函数的未使用的返回值。这样的警告通常会通过将演员表添加到void.
Jon*_*ler 76
这将是一个遗产的事情!
在有 C 标准之前,free()函数应该是(隐式的)类型int——因为还没有可靠的类型void可以返回。没有返回值。
当第一次修改代码以使用标准 C 编译器时,它可能没有包含<stdlib.h>(因为它在标准之前不存在)。旧代码会为分配函数(类似于和)编写extern char *malloc();(可能没有),并且不需要声明. 然后代码会将返回值转换为正确的类型——因为至少在某些系统上这是必要的(包括我学习 C 的系统)。externcalloc()realloc()free()
一段时间后,(void)添加了强制转换以告诉编译器(或者更有可能是lint)“free()故意忽略from 的返回值”以避免抱怨。但是最好添加<stdlib.h>并让其声明extern void free(void *vp);告诉lint或编译器没有可忽略的值。
JFTR:早在 80 年代中期,ICL Perq 最初是在面向字的体系结构上,并且char *内存位置的地址与指向同一位置的“anything_else 指针”非常不同。以char *malloc()某种方式宣布是至关重要的;将结果从它转换为任何其他指针类型至关重要。演员表实际上改变了 CPU 使用的数字。(当我们系统上的主内存从 1 MiB 升级到 2 MiB 时,也很高兴——因为内核使用了大约 3/4 MiB,这意味着用户程序可以在分页等之前使用 1 1/4 MiB。)
JL2*_*210 12
不需要这个演员表。当时可能不会,因为 C 已经以 C89 的形式标准化了。
如果是这样,那将是由于隐式声明。这通常意味着编写代码的人忘记了#include <stdlib.h>并且正在使用静态分析器。这不是最好的解决方法,#include <stdlib.h>而是一个更好的主意。以下是 C89 中关于隐式声明的一些措辞:
如果函数调用中带括号的参数列表前面的表达式仅由一个标识符组成,并且没有对该标识符可见的声明,则该标识符被隐式声明,就像在包含函数调用的最里面的块中一样,声明
Run Code Online (Sandbox Code Playgroud)extern int identifier();出现了。
但这很奇怪,因为它们没有转换malloc任何一个的结果,并且malloc和free在同一个头文件中。
也有可能这只是一个错误或告诉读者free没有返回结果的某种方式。