glibc - #define void

时间:2012-08-16 02:57:36

标签: c glibc libc

我开始研究glibc(GNU Libc) 了解它是如何写的。在malloc.c中,我找到了一段代码如下:

#ifndef void
#define void        void
#endif

有人可以向我解释这意味着什么吗?是不是始终定义void

由于

4 个答案:

答案 0 :(得分:7)

the git history,就像这样:

/*
  Void_t* is the pointer type that malloc should say it returns
*/

#ifndef Void_t
#if (__STD_C || defined(WIN32))
#define Void_t      void
#else
#define Void_t      char
#endif
#endif /*Void_t*/

这是历史[C]的变通方法,它没有voidmalloc()返回char *而不是void。该代码在2011年被Ulrich Drepper删除。提交似乎不是由脚本或任何自动生成的,因此他必须有自己的意图来定义。

提交消息没有说明void

  

简化malloc代码

     

删除所有未使用的配置选项和死代码。

答案 1 :(得分:4)

虽然void是C中的关键字,但关键字未定义为预处理程序符号。您引用的代码确保它也被定义为预处理程序符号。

我不知道为什么这是必要的。

答案 2 :(得分:3)

我不确定#define void void malloc.c的原因是什么,但我的猜测如下:

作为Yasushi Shoji mentionedvoid并不总是C中的关键字。当它被引入/标准化时,一个常见的解决方法是能够使用新的void关键字和编译器来编译代码不支持它的是将void定义为宏,例如:

#define void int   /* or maybe #define void char */

可以使用编译器命令行而不是通过标头来完成宏定义,这样就不需要确保所有转换单元都包含定义宏的标头。

但是,迁移到new关键字的程序员使用如下代码序列可能也很常见:

#ifndef void
#define void int
#endif
例如,您将看到以下代码:

/*
 * This is a fairly bogus thing to do, but there seems to be no better way for
 * compilers that don't understand void pointers.
 */
#ifndef void
#define void char
#endif
http://buildbot.zope.org/Squid-2.4STABLE6%2B/include/snmp_impl.h?annotate=1.1.1.1&cvsroot=Zope.org

中的

所以,我的猜测是#define void void中的malloc.c只是一种方法,可以防止其包含的标题中可能存在的任何此类序列重新定义void,但仍允许它之前已经定义为'gloablly'(malloc.c之前只有#define void void中的注释),以防它在不支持void的配置上编译。换句话说,如果void在开始编译malloc.c之前没有全局定义为宏,那么在编译之后没有理由将某些内容定义为其他内容。

答案 3 :(得分:0)

void可能总是有意义,但我会说 通常#define d。我不知道完全那里发生了什么,但是这段代码的结果是,如果有人稍后说#ifdef void,那就是真的。换句话说,通过此代码运行,它只会#define d到void一次。