Что с "#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)

Другие вопросы по тегам