Что с "#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?
Ответы
Ответ 1
В свое время 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
Ответ 2
Как отмечали другие, приложения Microsoft были перенесены на Mac, и им, вероятно, было проще превратить базовые API/фреймворки в переносимый уровень абстракции, а не переписывать сами приложения... так же, как сообщается в команде QuickTime при переносе в противоположном направлении (от Mac до Windows - в заголовках Mac Carbon есть аналогичные условия #if WIN32). Например, вместо того, чтобы перебирать всю вашу базу кода приложения Win32, которая ищет CreateFile(), и заменяя или ограничивая каждую ссылку с помощью #ifdefs, просто создайте версию CreateFile() Mac и сделайте с ней. Повторите для каждого вызова API Win32.
Удивительный бит исторической мелочи таков: конечный результат усилий по переносу Microsoft был доступен третьим лицам в виде "Microsoft Visual С++ Cross-Development Edition для Macintosh". Таким образом, любой может взять свое приложение Win32 и перенести его на Mac с помощью этого уровня абстракции.
Цитата из моей надежной MSDN Октябрь 1996 CD:
"Microsoft Visual С++ версия 4.0 Cross-Development Edition для Macintosh облегчает передачу программ для операционной среды Microsoft Windows в среду Macintosh или Power Macintosh Apple 680x0. Разработанная для обеспечения полной среды разработки программ, Visual С++ для Macintosh поддерживает C, стандартная библиотека времени C, С++, большая часть Microsoft Win32 API, включая OLE и ODBC, и библиотеку классов Microsoft Foundation."
Таким образом, он даже включал MFC. Я предполагаю, что любой "#ifdef _MAC" является артефактом MSVС++ Cross-Development Edition для Macintosh (R.I.P.).
Ответ 3
Я предполагаю, что он/использовался для компиляции программного обеспечения Microsoft (Office, IE, Windows Media Player) для MacOS. Я знаю, что IE и WMP для Solaris включали подмножество самой Windows (например, libwinnt.so, libkernel32.so) в качестве непосредственной замены для соответствующих DLL файлов Windows.
Ответ 4
В большинстве случаев код MS имеет ссылки на MAC, поскольку они также разрабатываются для Mac - например, офис. Вероятно, этот бит заголовка был получен из этих команд.