13

初めて修飾子に出くわしたとき、いくつかのコードを調べていましたが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
4

2 に答える 2

17

Microsoft は大きな負担を負っています。彼らは、35 年前に作成されたプログラムを最新の Windows バージョンでコンパイルして実行できるようにするために、可能な限りのことを行っています。正気の会社がこれほどばかげたことをしようとすることはありませんが、それが彼らが成功した主な理由です。宣言が Windows SDK ヘッダーに組み込まれると、それを再度削除するには非常に正当な理由が必要です。

そして、はい、それは本当に、どこかの古代の 16 ビット C プログラムがまだ保守および再コンパイルできることを意味します。これは、当時必要だったニアポインターとファーポインターを使用します。再コンパイル後も 32 ビット版と 64 ビット版の Windows で動作するのは偶然ではありません。

この種の後方互換性は、C などの言語にも存在します。今日まで、文字列リテラルは ではなくconst char*、単なるchar*です。まったく意味がありませんが、それを修正すると、あまりにも多くの既存のプログラムが壊れてしまいます。

于 2013-08-17T23:15:19.923 に答える
2

正解です。現在、それらは何にも使用されていません。

  1. それらを手動で削除する価値はありません(特にコンパイラがそれを実行できる場合)。
  2. Windows は複数のアーキテクチャをサポートしていることに注意してください。それらが再び意味を持つアーキテクチャに移植された場合、それらを追加し直す必要があるのは残念なことです。
于 2013-08-17T22:30:54.127 に答える