Windows头文件中的"#ifdef _MAC"是什么?

zil*_*n01 15 winapi platform-sdk

我正在浏览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;
Run Code Online (Sandbox Code Playgroud)

这是否意味着"Macintosh"?是否有时间可以为Macintosh编译Windows或Windows的子集?

Joh*_*ler 14

有一段时间,微软是全球最大的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
Run Code Online (Sandbox Code Playgroud)


小智 9

正如其他人已经注意到的那样,微软的应用程序被移植到Mac上,他们可能更容易将底层API /框架转换为可移植的抽象层,而不是自己重写应用程序......就像据报道QuickTime团队在移植时所做的那样在相反的方向(从Mac到Windows - 在Mac的Carbon标题中有类似的#if WIN32条件).例如,尽管您的整个Win32应用程序的代码库正在寻找CreateFile()并用#ifdefs替换或条件化每个引用,但只需创建一个Mac版本的CreateFile()并完成它.对每个Win32 API调用重复此操作.

令人惊讶的历史琐事就是这样:微软移植工作的最终结果可以通过"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"都是MSVC++ Cross-Development Edition for Macintosh(RIP)的工件.


jar*_*bjo 5

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