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

时间:2010-03-04 02:18:40

标签: 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;

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

5 个答案:

答案 0 :(得分:13)

有一段时间,微软是全球最大的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

答案 1 :(得分:8)

正如其他人所说,微软的应用程序被移植到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(R.I.P。)的工件。

答案 2 :(得分:3)

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

答案 3 :(得分:1)

许多MS代码都引用了MAC,因为它们也为mac开发 - 例如office。可能这些头文件来自这些团队。

答案 4 :(得分:0)

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

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

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