Что с "#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 - например, офис. Вероятно, этот бит заголовка был получен из этих команд.