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


当我偶然发现时,我正在阅读一些代码 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;

编辑:第一个评论也是一个好点,如果这是什么意思 far 和 near 被定义为什么?

// WinDef.h: Lines 91-91
#define far
#define near

13201
2018-05-29 12:51


起源

不要行91-2(至少在v7.1a中) #define far 和 near 什么都没有?但你是对的,我怀疑他们已经不再需要了。 - Rup
那里有很多非常古老的代码。 - Raymond Chen
没有理由使用它们,它们仍然是为了与旧代码向后兼容。 - Alex F
但如果他们被定义为什么都没有,它怎么能支持任何东西呢?它只是意味着如果是限定符 near 要么 far 遇到基本上把它当作空白?
将它们定义为零只是简单地避免了仍包含这些限定符的旧代码的编译错误。它们绝对可以而且应该被视为现代代码中的空白(现代是过去20年左右所写的任何内容)。 - Carey Gregory


答案:


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

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

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


12
2017-08-17 23:15





正确,它们目前不用于任何东西。

  1. 它不值得手动删除它们(特别是当 编译器可以为你做)。
  2. 请记住,Windows支持 多种体系结构,很难添加它们 如果将它移植到一个有意义的架构中,那就回来了 再次。

2
2017-08-17 22:30



在编写NEAR == FAR ==没有的代码20年之后,我怀疑有很多代码可以在这样的架构中工作,如果这种疯狂会再次出现。 - rodrigo
@rodrigo:如果没有破坏,请不要修理它。 - SigTerm
@SigTerm参加派对有点晚了,但我想不同意并反对童子军规则。这样的事情使得很难支持遗留代码。我会删除远/近,看它是否编译目标架构和单元测试仍然运行。 - RobbyD