Что с "#ifdef _MAC" в заголовочных файлах Windows?
Я просматривал заголовочные файлы Windows Platform SDK (что за жизнь, верно?), И я заметил, что во многих местах содержались ссылки на символ препроцессора. _MAC
, Например:
// WinUser.h line 1568
/*
* Message structure
*/
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
#ifdef _MAC
DWORD lPrivate;
#endif
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;
Означает ли это "Macintosh", как кажется? Было ли время, когда Windows или подмножество Windows можно было скомпилировать для Macintosh?
4 ответа
В свое время Microsoft была крупнейшим разработчиком программного обеспечения для Macintosh в мире. Excel и Word доминировали на своих рынках Macintosh, а затем и Office. Поэтому неудивительно, что подразделение приложений в MS хотело бы иметь подмножество заголовочных файлов Windows, которые работали на MAC - чтобы облегчить поддержку их кроссплатформенного программного обеспечения.
Но не было ни одной версии ОС Windows, которая бы работала на Macintosh.
В любом случае, этот фрагмент из objidl.h, похоже, указывает на то, что _MAC действительно означает Macintosh в заголовочных файлах, хотя...
//FSSpec is Macintosh only, defined in macos\files.h
#ifdef _MAC
typedef struct tagSTATSTG
{
LPOLESTR pwcsName;
FSSpec *pspec;
DWORD type;
ULARGE_INTEGER cbSize;
...
} STATSTG;
#else //_MAC
Как уже отмечали другие, приложения Microsoft были перенесены на Mac, и они, вероятно, обнаружили, что проще превратить базовые API / каркасы в переносимый уровень абстракции, а не переписывать сами приложения... как, как сообщалось, команда QuickTime делала при переносе. в противоположном направлении (от Mac до Windows - в заголовках Carbon Mac есть аналогичные условные обозначения #if WIN32). Например, вместо того, чтобы ломать голову всей кодовой базы вашего приложения Win32, ищущей CreateFile() и заменяющей или обусловливающей каждую ссылку с помощью #ifdefs, просто создайте версию CreateFile() для Mac и покончите с этим. Повторите для каждого вызова Win32 API.
Удивительным моментом исторической мелочи является то, что конечный результат усилий Microsoft по переносу был доступен третьим сторонам в виде "Microsoft Visual C++ Cross-Development Edition для Macintosh". Так что любой может взять свое приложение Win32 и перенести его на Mac, используя этот уровень абстракции.
Цитата из моего верного диска MSDN, октябрь 1996 года:
"Microsoft Visual C++ версии 4.0 Cross-Development Edition для Macintosh облегчает перенос программ для операционной среды Microsoft Windows в среду Apple 680x0 Macintosh или Power Macintosh. Предназначенная для предоставления полной среды разработки программ, Visual C++ для Macintosh поддерживает C, стандартная библиотека времени выполнения C, C++, большая часть Microsoft Win32 API, включая OLE и ODBC, и библиотека классов Microsoft Foundation."
Так что это даже включало MFC. Я предполагаю, что любой "#ifdef _MAC" является артефактом MSVC++ Cross-Development Edition для Macintosh (RIP).
Я предполагаю, что он использовался / использовался для компиляции программного обеспечения Microsoft (Office, IE, Windows Media Player) для MacOS. Я знаю, что IE и WMP для Solaris включали подмножество самой Windows (например, libwinnt.so, libkernel32.so) в качестве прямой замены для соответствующих библиотек DLL Windows.
Во многих кодах MS есть ссылки на MAC, так как они разрабатываются и для Mac - например, для офиса. Вероятно, этот бит заголовочного файла поступил от этих команд.
Как вы можете видеть в заголовочном файле Windows.h, макрос _MAC определяется следующим образом:
#if defined(_68K_) || defined(_MPPC_)
#define _MAC
#endif
#endif
Итак, да, он определен только для старой среды macOS (до того, как она начала использовать процессоры Intel)