为什么将 free 的 return 值转换为 void?
Why cast free's return value to void?
我正在阅读一本使用 C 的书(Programming with POSIX Threads,Butenhof,1997 年),我看到了以下行:
(void)free(data);
这里,data
只是一个指向已分配结构的指针,
data = malloc(sizeof(my_struct_t));
为什么 free
的结果被转换为 void
?
根据我对 C 的理解,这似乎没有意义,原因有两个:
- 免费功能已经returns
void
- 代码没有使用 return 值(它甚至没有被分配给变量)
这本书写于 1997 年。这是某种遗产吗?
作者提到示例是 运行 在 Digital Unix 4.0d 上,但我仍然无法想象如果您不打算使用该结果,那么有理由强制转换函数的结果.
不需要此转换。当时可能不会,因为 C 已经以 C89 的形式标准化。
如果是,那将是由于隐式声明。这通常意味着编写代码的人忘记了 #include <stdlib.h>
并且正在使用静态分析器。这不是最好的解决方法,更好的主意是 #include <stdlib.h>
。以下是 C89 中关于隐式声明的一些措辞:
If the expression that precedes the parenthesized argument list in a function call consists solely of an identifier, and if no declaration is visible for this identifier, the identifier is implicitly declared exactly as if, in the innermost block containing the function call, the declaration
extern int identifier();
appeared.
但这很奇怪,因为它们也没有转换 malloc
的结果,并且 malloc
和 free
在同一个头文件中。
也有可能这只是一个错误或某种方式告诉 reader free
returns 没有结果。
如果我们谈论的是标准 free
函数,那么它的原型是
void free(void *ptr);
因此演员表完全没用。
现在一些猜测。
作者可能忘记包含 stdlib.h
header 声明此原型,因此编译器将其 return 类型假定为 int
。现在,在对该代码进行静态分析期间,编译器警告它认为是非 void
函数的未使用 return 值。这样的警告通常通过将强制转换添加到 void
.
来消除
这将是一个遗产!
在有 C 标准之前,free()
函数应该是(隐含地)类型 int
— 因为还没有可靠的类型 void
来 return。没有价值 returned。
当代码第一次被修改为与标准 C 编译器一起工作时,它可能不包括 <stdlib.h>
(因为它在标准之前不存在)。旧代码会为分配函数(类似于 calloc()
和 realloc()
)编写 extern char *malloc();
(可能没有 extern
),并且不需要声明 free()
.然后代码会将 return 值转换为正确的类型——因为这至少在某些系统(包括我学习 C 的系统)上是必需的。
一段时间后,添加了 (void)
转换以告诉编译器(或者更可能是 lint
)"the return value from free()
is deliberately ignored" 以避免投诉。但最好添加 <stdlib.h>
并让它的声明 extern void free(void *vp);
告诉 lint
或编译器没有可忽略的值。
JFTR:早在 80 年代中期,ICL Perq 最初是在面向字的体系结构上,内存位置的 char *
地址与 'anything_else pointer' 的数字非常不同到同一个位置。以某种方式声明 char *malloc()
至关重要;将其结果转换为任何其他指针类型至关重要。演员表实际上改变了 CPU 使用的数字。 (当我们系统上的主内存从 1 MiB 升级到 2 MiB 时,我们也很高兴——因为内核使用了大约 3/4 MiB,这意味着用户程序可以在分页等之前使用 1 1/4 MiB。)
我正在阅读一本使用 C 的书(Programming with POSIX Threads,Butenhof,1997 年),我看到了以下行:
(void)free(data);
这里,data
只是一个指向已分配结构的指针,
data = malloc(sizeof(my_struct_t));
为什么 free
的结果被转换为 void
?
根据我对 C 的理解,这似乎没有意义,原因有两个:
- 免费功能已经returns
void
- 代码没有使用 return 值(它甚至没有被分配给变量)
这本书写于 1997 年。这是某种遗产吗?
作者提到示例是 运行 在 Digital Unix 4.0d 上,但我仍然无法想象如果您不打算使用该结果,那么有理由强制转换函数的结果.
不需要此转换。当时可能不会,因为 C 已经以 C89 的形式标准化。
如果是,那将是由于隐式声明。这通常意味着编写代码的人忘记了 #include <stdlib.h>
并且正在使用静态分析器。这不是最好的解决方法,更好的主意是 #include <stdlib.h>
。以下是 C89 中关于隐式声明的一些措辞:
If the expression that precedes the parenthesized argument list in a function call consists solely of an identifier, and if no declaration is visible for this identifier, the identifier is implicitly declared exactly as if, in the innermost block containing the function call, the declaration
extern int identifier();
appeared.
但这很奇怪,因为它们也没有转换 malloc
的结果,并且 malloc
和 free
在同一个头文件中。
也有可能这只是一个错误或某种方式告诉 reader free
returns 没有结果。
如果我们谈论的是标准 free
函数,那么它的原型是
void free(void *ptr);
因此演员表完全没用。
现在一些猜测。
作者可能忘记包含 stdlib.h
header 声明此原型,因此编译器将其 return 类型假定为 int
。现在,在对该代码进行静态分析期间,编译器警告它认为是非 void
函数的未使用 return 值。这样的警告通常通过将强制转换添加到 void
.
这将是一个遗产!
在有 C 标准之前,free()
函数应该是(隐含地)类型 int
— 因为还没有可靠的类型 void
来 return。没有价值 returned。
当代码第一次被修改为与标准 C 编译器一起工作时,它可能不包括 <stdlib.h>
(因为它在标准之前不存在)。旧代码会为分配函数(类似于 calloc()
和 realloc()
)编写 extern char *malloc();
(可能没有 extern
),并且不需要声明 free()
.然后代码会将 return 值转换为正确的类型——因为这至少在某些系统(包括我学习 C 的系统)上是必需的。
一段时间后,添加了 (void)
转换以告诉编译器(或者更可能是 lint
)"the return value from free()
is deliberately ignored" 以避免投诉。但最好添加 <stdlib.h>
并让它的声明 extern void free(void *vp);
告诉 lint
或编译器没有可忽略的值。
JFTR:早在 80 年代中期,ICL Perq 最初是在面向字的体系结构上,内存位置的 char *
地址与 'anything_else pointer' 的数字非常不同到同一个位置。以某种方式声明 char *malloc()
至关重要;将其结果转换为任何其他指针类型至关重要。演员表实际上改变了 CPU 使用的数字。 (当我们系统上的主内存从 1 MiB 升级到 2 MiB 时,我们也很高兴——因为内核使用了大约 3/4 MiB,这意味着用户程序可以在分页等之前使用 1 1/4 MiB。)