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,看看它是否为目标体系结构编译,并且单元测试是否仍在运行。