我遇到了一些我无法在Google或SO上找到答案的代码。我正在寻找一个线程函数,它返回void *,如你所料。但是,在线程函数结束之前它会突然拉出这个特技,
return (void*) 0;
那是什么目的?我无法理解它。
编辑:
在理解了这与NULL相同之后 - 我认为他们用它来跳过包括stdlib。
答案 0 :(得分:2)
(void*)0
是空指针,又名NULL
(实际上是在几个头文件中定义的宏,例如stddef.h
或stdio.h
,基本上相同事情为(void*)0
)。
更新:
如何解释空指针及其用处?基本上,它是一个特殊值,表示“此指针不指向任何地方”,或者“此指针未设置为有效的对象引用。”
历史记录:Tony Hoare,据说他在1965年发明了空引用,众所周知对这一发明感到后悔,因而称之为"Billion Dollar Mistake":
每当使用指针时,必须确保永远不要取消引用空指针(因为它没有按定义引用任何内容)。无论如何,如果你这样做,你至少会得到异常程序终止,一般保护错误或者意外的程序行为。
答案 1 :(得分:0)
好吧,我没有遇到过任何C ++编译器,说NULL
或0
无法转换为void*
(或者来自int*
)。但是可能会有一些智能编译器或静态分析工具将0 to void-pointer
转换报告为警告。
该语句通常出现在回调实现中(如线程例程),它必须遵循所要求的回调原型(pthread_create
,CreateThread
等)。因此,在实现该功能时,必须返回所需的相同类型。对于pthread_create
例程,您必须返回void*
- 这就是return (void*)0;
所在的原因。