【问题标题】:Purpose of uppercase VOID macro & INT typedef in winnt.hwinnt.h 中大写 VOID 宏和 INT typedef 的用途
【发布时间】:2011-10-03 21:18:26
【问题描述】:

有人知道为什么在winnt.h 标头中定义了大写的VOID 宏吗?

为了让事情更混乱,VOID 是一个宏,而CHARSHORTINTLONG 是类型定义。

查看winnt.h的相关摘录:

#ifndef VOID
#define VOID void
typedef char CHAR;
typedef short SHORT;
typedef long LONG;
#if !defined(MIDL_PASS)
typedef int INT;
#endif
#endif

可能是使用VOID* pointer 而不是void* pointer 的历史原因?

编辑:更令人不安的是,今天在进行 Windows 编程时看到人们使用 VOID 而不是 void。您也可以将其视为 MSDN 文档的一部分,例如http://msdn.microsoft.com/en-us/library/bb205867(v=vs.85).aspx

【问题讨论】:

    标签: c++ windows visual-c++


    【解决方案1】:

    Windows API 是旧的。 真的老了。比官方的 C 标准更早。

    这意味着,一开始,Windows API 必须处理各种古老的 C 编译器,具有不同级别的语言支持。有些可能不支持void。有些人的int 类型可能与Windows 认为的int 不兼容。有些人可能不理解short。作为一种解决方法,Windows API 提供了大写的可移植等效项,这些等效项被别名为适用于该特定编译器的任何内容。

    当然,有了现代编译器,事情已经稳定了很多。例如,每个人都支持void。但是,为了保持与使用这些大写宏的旧代码的兼容性,#defines 和 typedefs 必须保留。

    【讨论】:

    【解决方案2】:

    最初的原因是 Win32 API 原本应该是独立于语言的,所以他们自己命名(遵循他们的命名约定),然后提供了一个 C 实现。实际上,他们定义的大部分内容往往会被大多数使用其他语言的人(甚至大部分使用 C 语言的人)忽略。

    至于为什么VOID#define 而不是typedef,这很简单:所需的typedef 应该typedef void VOID;,但是C(如“定义" 从那时起微软的 C 编译器) 根本不允许这样做,所以他们使用宏来代替。

    【讨论】:

    • 不,你倒退了。所需的 typedef 将是 typedef void VOID,这是完全允许的。试试看。
    • 我确实将 typedef 向后输入。然而,即使更正了,微软的编译器从那时起也不允许这样做,这(当然)是微软对 C 的定义。当时大多数编译器都允许这样做,微软现在也允许这样做,但我有理由确定他们的旧版本那些没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 2012-10-03
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    相关资源
    最近更新 更多