任何人都知道为什么在VOID
标题中定义了大写的winnt.h
宏?
为了让问题更加混乱,VOID
是一个宏,而CHAR
,SHORT
,INT
和LONG
是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
答案 0 :(得分:18)
Windows API已经过时了。 真的旧。比官方C标准旧。
这意味着,在一开始,Windows API必须处理各种古老的C编译器,具有不同级别的语言支持。有些人可能不支持void
。有些可能有int
类型,与int
的窗口不兼容。有些人可能不理解short
。作为一种解决方法,Windows API提供了大写的便携式等价物,这些等价物可以替代适用于该特定编译器的任何内容。
当然,对于现代编译器来说,事情已经稳定下来了。例如,每个人都支持void
。但是,为了保持与使用这些大写宏的旧代码的兼容性,#define
和typedef
必须保留。
答案 1 :(得分:12)
最初的原因是Win32 API最初应该是与语言无关的,所以它们组成了自己的名字(遵循它们的命名约定),然后提供了它的C实现。实际上,他们定义的大部分内容往往被大多数人使用其他语言所忽略(在很大程度上甚至是使用C语言的人)。
至于为什么VOID
是#define
而不是typedef
,这非常简单:所需的typedef
将为{{ 1}},但是C(由Microsoft的C编译器“定义”从那时起)根本不允许这样做,因此他们使用宏来代替。