Что с "#ifdef _MAC" в заголовочных файлах Windows? - PullRequest
15 голосов
/ 04 марта 2010

Я просматривал заголовочные файлы 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 ]

13 голосов
/ 04 марта 2010

В свое время Microsoft была крупнейшим разработчиком программного обеспечения Macintosh в мире. Excel и Word доминировали на своих рынках Macintosh, а затем и Office. Поэтому неудивительно, что подразделение приложений в MS хотело бы иметь подмножество заголовочных файлов Windows, которые работали на MAC - чтобы облегчить поддержку их кроссплатформенного программного обеспечения.

Но на Macintosh никогда не было версии ОС Windows, которая бы работала.

В любом случае, этот фрагмент из 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
8 голосов
/ 09 декабря 2010

Как уже отмечали другие, приложения 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, CD:

"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 (R.I.P.).

3 голосов
/ 04 марта 2010

Я предполагаю, что он использовался / использовался для компиляции программного обеспечения Microsoft (Office, IE, Windows Media Player) для MacOS. Я знаю, что IE и WMP для Solaris включали подмножество самой Windows (например, libwinnt.so, libkernel32.so) в качестве прямой замены для соответствующих библиотек DLL Windows.

1 голос
/ 04 марта 2010

Во многих кодах MS есть ссылки на MAC, так как они разрабатываются и для Mac - например, для офиса. Возможно, этот бит заголовочного файла получен от этих команд.

...