WinDef.h почему все еще здесь? С++

Я просматривал какой-то код, когда я впервые наткнулся на квалификатор 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

Ответ 1

Microsoft несет большую нагрузку, они делают все возможное, чтобы программы, которые были написаны 35 лет назад, все еще компилируются и запускаются в современных версиях Windows. Никакая здравомыслящая компания никогда не попыталась бы так глупо, как это, но главная причина, по которой они были успешными. Когда объявление превращается в заголовок SDK Windows, для его удаления требуется очень и очень хорошая причина.

И да, это действительно означает, что некоторая древняя 16-битная программа C где-то еще может быть сохранена и перекомпилирована. Который использует ближний и дальний указатели, что было необходимо тогда. То, что он по-прежнему работает на 32-разрядных и 64-разрядных версиях Windows после перекомпиляции, не случайно.

Этот вид back-compat существует также на языке C. До сих пор строковый литерал не является const char*, просто char*. Не имеет никакого смысла, но исправление этого может сломать слишком много существующих программ.

Ответ 2

Правильно, они в настоящее время не используются ни для чего.

  • Не стоит пытаться вручную удалить их (особенно когда компилятор может сделать это за вас).
  • Имейте в виду, что Windows поддерживает несколько архитектур, и сосать придется добавить их назад, если бы он был перенесен в архитектуру, где они имели смысл еще раз.