【问题标题】:glibc - #define voidglibc - #define void
【发布时间】:2012-08-12 09:17:25
【问题描述】:

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

#ifndef void
#define void        void
#endif

谁能给我解释一下这是什么意思? void 不是一直定义的吗?

谢谢

【问题讨论】:

    标签: c glibc libc


    【解决方案1】:

    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 代码

    删除各种未使用的配置选项和死代码。

    【讨论】:

    • 感谢您的链接。这很有帮助。我看到上面的代码被删除了,所有的变化都是从Void_tvoid,但是#define void void 对我来说仍然没有意义。
    • 对我来说也不是。我检查了 glibc 代码,看看是否有 #ifdef void 进行条件编译,但我找不到。最好只问他或在 glibc 邮件列表上。但我不知道。
    • 我非常确定这只是重构的拙劣部分,可以直接删除。
    【解决方案2】:

    我不确定#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

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

    【讨论】:

      【解决方案3】:

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

      我不知道为什么需要这样做。

      【讨论】:

        【解决方案4】:

        void 可能总是有意义的,但我会说 void isn't 通常#defined。我不知道确切那里发生了什么,但这段代码运行的结果是,如果稍后有人说#ifdef void,那将是真的。所以换句话说,通过这次代码运行,它只会将#defined 变为void 一次。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-28
          • 1970-01-01
          • 2019-09-06
          • 1970-01-01
          • 2018-04-04
          • 1970-01-01
          相关资源
          最近更新 更多