大写VOID宏的目的&在winnt.h中使用INT typedef

时间:2011-07-12 18:20:01

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

任何人都知道为什么在VOID标题中定义了大写的winnt.h宏?

为了让问题更加混乱,VOID是一个宏,而CHARSHORTINTLONG是typedef。

请参阅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

2 个答案:

答案 0 :(得分:18)

Windows API已经过时了。 真的旧。比官方C标准旧。

这意味着,在一开始,Windows API必须处理各种古老的C编译器,具有不同级别的语言支持。有些人可能不支持void。有些可能有int类型,与int的窗口不兼容。有些人可能不理解short。作为一种解决方法,Windows API提供了大写的便携式等价物,这些等价物可以替代适用于该特定编译器的任何内容。

当然,对于现代编译器来说,事情已经稳定下来了。例如,每个人都支持void。但是,为了保持与使用这些大写宏的旧代码的兼容性,#definetypedef必须保留。

答案 1 :(得分:12)

最初的原因是Win32 API最初应该是与语言无关的,所以它们组成了自己的名字(遵循它们的命名约定),然后提供了它的C实现。实际上,他们定义的大部分内容往往被大多数人使用其他语言所忽略(在很大程度上甚至是使用C语言的人)。

至于为什么VOID#define而不是typedef,这非常简单:所需的typedef 为{{ 1}},但是C(由Microsoft的C编译器“定义”从那时起)根本不允许这样做,因此他们使用宏来代替。