2013-05-29 3 views
11

Я проходил через какой-то код, когда впервые наткнулся на квалификатор far, теперь для меня имеет смысл, почему они раньше использовались. Но с моделью памяти, которую мы используем сегодня, почему они уже существуют? Действительно ли люди используют их на практике, или они просто там, как безделушка из прошлого?WinDef.h почему все еще здесь? C++

Какая разница между использованием typedef BOOL near *PBOOL; и typedef BOOL far *LPBOOL;?

Есть ли real использовать для этого еще? Или я должен просто смотреть в другую сторону.

// 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; 

EDIT: первый комментарий делает хорошую точку тоже, что это означает теперь, если far и near определены ни к чему?

// WinDef.h: Lines 91-91 
#define far 
#define near 
+0

Не линии 91-2 (по крайней мере, в v7.1a) также '#define far' и' near' ни к чему? Но ты прав, я сомневаюсь, что они нужны больше. – Rup

+6

Там очень много старого кода. –

+1

Нет причин использовать их, они остаются для обратной совместимости со старым кодом. –

ответ

2

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

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

После 20 лет написания кода, где NEAR == FAR == ничего, я сомневаюсь, что есть много кода, который будет работать в такой архитектуре, если это безумие когда-нибудь вернется. – rodrigo

+0

@rodrigo: Если он не сломался, не исправляйте его. – SigTerm

+0

@SigTerm немного опоздал на вечеринку, но я хочу не согласиться и встретить правила мальчика-разведчика. Такие вещи затрудняют поддержку устаревшего кода. Я бы удалил far/near и посмотрел, если он компилируется для целевой архитектуры, а модульные тесты все еще выполняются. – RobbyD

12

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

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

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

Смежные вопросы