WinDef.h为什么远近还在这里?C++

12 winapi

当我far第一次偶然发现限定符时,我正在阅读一些代码,现在我觉得为什么这些曾经被使用过了.但是我们现在使用的内存模型为什么这些甚至已经存在?人们是否真的在实践中使用这些,或者他们只是作为过去的饰品?

使用typedef BOOL near *PBOOL;和之间甚至会有什么区别typedef BOOL far *LPBOOL;

有没有真正为这些还在使用?或者我应该只看另一种方式.

// WinDef.h ~Line 144
#undef FAR
#undef  NEAR
#define FAR                 far
#define NEAR                near
#ifndef CONST
#define CONST               const
#endif

typedef unsigned long       DWORD;
typedef int                 BOOL;
typedef unsigned char       BYTE;
typedef unsigned short      WORD;
typedef float               FLOAT;
typedef FLOAT               *PFLOAT;
typedef BOOL near           *PBOOL;
typedef BOOL far            *LPBOOL;
typedef BYTE near           *PBYTE;
typedef BYTE far            *LPBYTE;
typedef int near            *PINT;
typedef int far             *LPINT;
typedef WORD near           *PWORD;
typedef WORD far            *LPWORD;
typedef long far            *LPLONG;
typedef DWORD near          *PDWORD;
typedef DWORD far           *LPDWORD;
typedef void far            *LPVOID;
typedef CONST void far      *LPCVOID;
Run Code Online (Sandbox Code Playgroud)

编辑:第一评论使得一个好点过,这是什么意思了,如果farnear被定义为没有?

// WinDef.h: Lines 91-91
#define far
#define near
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 15

微软承担着巨大的负担,他们尽一切努力使35年前编写的程序仍然可以在现代Windows版本上编译和运行.没有理智的公司会尝试如此愚蠢的事情,但这是他们成功的核心原因.一旦声明将其转换为Windows SDK标头,就会有一个非常非常好的理由再次将其删除.

是的,这确实意味着某些古老的16位C程序仍然可以维护和重新编译.哪个使用近远点指针,那是必要的.它在重新编译后仍然适用于32位和64位版本的Windows并非偶然.

这种反向比较也存在于像C这样的语言中.直到今天,字符串文字不是const char*,只是char*.是没有任何意义,但修复它会破坏方式太多了现有的方案.


jos*_*ley 2

是的,它们目前没有用于任何用途。

  1. 不值得手动删除它们(特别是当编译器可以为您执行此操作时)。
  2. 请记住,Windows 支持多种体系结构,如果将其移植到它们再次有意义的体系结构中,则必须将它们重新添加回来,这将是一件很糟糕的事情。

  • 经过 20 年编写 NEAR==FAR==nothing 的代码后,我怀疑是否有很多代码可以在这样的架构中工作,如果这种疯狂再次出现的话。 (3认同)