19

我正在浏览 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”?有没有可以为 Macintosh 编译 Windows 或 Windows 子集的时间?

4

5 回答 5

20

曾几何时,微软是世界上最大的 Macintosh 软件开发商。Excel 和 Word 在 Macintosh 上占据了各自的市场,后来 Office 也是如此。因此,MS 的应用程序部门想要在 MAC 上工作的 Windows 头文件子集也就不足为奇了——以使他们的跨平台软件更易于维护。

但是从来没有任何版本的 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
于 2010-03-04T02:33:40.967 回答
12

正如其他人所指出的,Microsoft 应用程序被移植到 Mac 上,他们可能发现将底层 API/框架转变为可移植的抽象层更容易,而不是自己重写应用程序……就像 QuickTime 团队在移植时所做的那样在相反的方向(从 Mac 到 Windows - Mac 的 Carbon 标头中有类似的 #if WIN32 条件)。例如,与其在整个 Win32 应用程序的代码库中寻找 CreateFile() 并用 #ifdefs 替换或限定每个引用,不如创建一个 Mac 版本的 CreateFile() 并完成它。对每个 Win32 API 调用重复此操作。

令人惊讶的历史琐事是:Microsoft 移植工作的最终结果以“Microsoft Visual C++ Cross-Development Edition for Macintosh”的形式提供给第三方。因此,任何人都可以使用这个抽象层将他们的 Win32 应用程序移植到 Mac 上。

引自我信赖的 MSDN 1996 年 10 月 CD:

“用于 Macintosh 的 Microsoft Visual C++ 版本 4.0 Cross-Development Edition 有助于将 Microsoft Windows 操作环境的程序转移到 Apple 680x0 Macintosh 或 Power Macintosh 环境中。Visual C++ for Macintosh 旨在提供完整的程序开发环境,支持 C、标准 C 运行时库、C++、大部分 Microsoft Win32 API,包括 OLE 和 ODBC,以及 Microsoft 基础类库。”

所以它甚至包括 MFC。我的猜测是,任何“#ifdef _MAC”都是 Macintosh (RIP) 的 MSVC++ Cross-Development Edition 的产物。

于 2010-12-09T00:22:17.953 回答
4

我假设它是/曾经用于为 MacOS 编译 Microsoft 软件(Office、IE、Windows Media Player)。我知道用于 Solaris 的 IE 和 WMP 包含 Windows 本身的一个子集(例如 libwinnt.so、libkernel32.so)作为相应 Windows DLL 的直接替代品。

于 2010-03-04T02:24:31.980 回答
1

许多 MS 代码在为 mac 开发时也引用了 MAC - 例如办公室。可能这部分头文件来自那些团队。

于 2010-03-04T02:25:07.503 回答
1

在 Windows.h 头文件中可以看到,宏 _MAC 定义如下:

#if defined(_68K_) || defined(_MPPC_)
#define _MAC
#endif
#endif

所以,是的,它只为旧的 macOS 环境定义(在它开始使用英特尔处理器之前)

于 2019-10-22T10:51:40.833 回答