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.
Jer*_*fin 12
最初的原因是Win32 API最初应该是与语言无关的,所以它们组成了自己的名字(遵循它们的命名约定),然后提供了它的C实现.实际上,他们定义的大部分内容往往被大多数人使用其他语言所忽略(在很大程度上甚至是使用C语言的人).
至于为什么VOID是一个#define代替typedef,这是相当简单:需要typedef 会是typedef void VOID;,但C(从那个时候"定义"微软的C语言编译器)根本不允许,所以他们使用宏来代替.
| 归档时间: |
|
| 查看次数: |
2828 次 |
| 最近记录: |