winnt.h中大写VOID宏和INT typedef的用途

Nic*_*ick 7 c++ windows visual-c++

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

为了使事情更加混乱,VOID是一个宏观的,而CHAR,SHORT,INT,和LONG是类型定义.

参见相关摘录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
Run Code Online (Sandbox Code Playgroud)

一个历史原因或许可以VOID* pointer代替void* pointer

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

bdo*_*lan 18

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

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

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

  • Raymond Chen有许多关于Windows历史的有趣博客文章.虽然据我所知,他还没有写过关于"VOID"的文章,但他已经写过关于Win32中所有布尔变体的文章:http://blogs.msdn.com/b/oldnewthing/archive/2004/12/ 22/329884.aspx和http://blogs.msdn.com/b/oldnewthing/archive/2011/03/28/10146459.aspx. (6认同)

Jer*_*fin 12

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

至于为什么VOID是一个#define代替typedef,这是相当简单:需要typedef typedef void VOID;,但C(从那个时候"定义"微软的C语言编译器)根本不允许,所以他们使用宏来代替.

  • 我确实向后输入了typedef.修正即使,但是,它不是从那个时候,(当然),而这正是微软的C.大多数编译器的定义处理允许它那么微软的编译器允许,和微软的做了,但我相当肯定自己年龄大没有. (4认同)