13

当我第一次偶然发现far限定符时,我正在浏览一些代码,现在对我来说为什么使用这些是有道理的。但是对于我们今天使用的内存模型,为什么这些甚至还存在呢?人们是否真的在实践中使用这些,或者它们只是作为过去的小饰品存在?

typedef BOOL near *PBOOL;使用and之间甚至有什么区别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
4

2 回答 2

17

微软背负着沉重的负担,他们尽一切可能使 35 年前编写的程序仍然可以在现代 Windows 版本上编译和运行。没有一个理智的公司会尝试做这么愚蠢的事情,然而这是他们成功的核心原因。一旦声明进入 Windows SDK 标头,就需要非常非常好的理由再次将其删除。

是的,这确实意味着某些地方的一些古老的 16 位 C 程序仍然可以维护和重新编译。它使用近和远指针,这在当时是必要的。重新编译后它仍然可以在 32 位和 64 位版本的 Windows 上运行,这绝非偶然。

这种向后兼容也存在于像 C 这样的语言中。直到今天,字符串文字还不是 a const char*,只是char*。没有任何意义,但修复它会破坏太多现有程序。

于 2013-08-17T23:15:19.923 回答
2

正确,它们目前没有用于任何事情。

  1. 手动删除它们是不值得的(尤其是当编译器可以为您完成时)。
  2. 请记住,Windows 支持多种体系结构,如果将其移植到它们再次有意义的体系结构中,则必须重新添加它们会很糟糕。
于 2013-08-17T22:30:54.127 回答