Winapi 为什么远近都还在这里?C++;

Winapi 为什么远近都还在这里?C++;,winapi,Winapi,当我第一次偶然发现far限定符时,我正在浏览一些代码,现在我明白了为什么要使用这些限定符。但是,对于我们今天使用的记忆模型,为什么这些模型还存在?人们真的会在实践中使用这些东西吗,还是它们只是过去的一件小饰物 在*PBOOL附近使用typedef BOOL有什么区别和typedef BOOL far*LPBOOL 这些还有什么真正的用途吗?或者我应该换个角度看 // WinDef.h ~Line 144 #undef FAR #undef NEAR #define FAR

当我第一次偶然发现
far
限定符时,我正在浏览一些代码,现在我明白了为什么要使用这些限定符。但是,对于我们今天使用的记忆模型,为什么这些模型还存在?人们真的会在实践中使用这些东西吗,还是它们只是过去的一件小饰物

在*PBOOL附近使用
typedef BOOL有什么区别
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

正确,它们当前未用于任何用途

  • 不值得手动删除它们(尤其是在 编译器可以为您执行此操作)
  • 请记住,Windows支持 多个体系结构,如果必须添加它们,那就太糟糕了 如果它被移植到一个有意义的架构中 再说一遍

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

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


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

    第91-2行(至少在v7.1a中)不也将远近定义为零吗?但你是对的,我怀疑它们是否还需要。有很多真正的旧代码存在。没有理由使用它们,它们仍然与旧代码向后兼容。但是如果它们被定义为空,它怎么能支持任何东西呢?这是否仅仅意味着,如果遇到限定符
    near
    far
    ,基本上将其视为空白?将它们定义为nothing可以避免仍然包含这些限定符的旧代码的编译错误。在现代代码中,它们绝对可以而且应该被视为空白(现代是过去20年左右编写的任何东西)。在编写了近==远==零的代码20年后,我怀疑如果这种疯狂再次出现,在这种体系结构中会有很多代码可以工作。@rodrigo:如果它没有崩溃,别把它修好了。我来晚了一点,但我不同意并反对童子军的规定。像这样的事情使得很难支持遗留代码。我将删除far/near,看看它是否为目标体系结构编译,并且单元测试是否仍在运行。