C/C++ 跨平台编译宏
在编译跨平台程序时,我们难免会遇到 win32、 linux 等编译器或编译环境宏。它们向编译器指示当前平台环境的一些信息。
在编译跨平台程序时,我们难免会遇到 _win32、Linux 等编译环境宏。_win32 与 win32 之间有不少区别。这里整理了一份清单,作为备忘。
例如,若有一段代码只能在类 Unix 平台下编译,而在非类 Unix 平台上会编译出错,那么我可以在代码中加一个宏来检查是否处于 Unix 环境;若并非正常编译环境,则直接抛出错误。
#ifndef __unix__
#error 该程序应在类 UNIX 平台下编译并运行。
#endif
完整代码如下:
#ifndef __unix__
#error 该程序应在类 UNIX 平台下编译并运行。
#endif
#include <stdio.h>
int main()
{
printf("这是类 Unix 平台");
return 0;
}
这段代码可以在 Mac OS 与 Linux 环境下正常编译,在 Windows 下则会报错。
以下是检测环境的宏清单。
请将更新或更正发送至 predef-contribute。
AIX
| 类型 | 宏 | 描述 |
|---|
| 识别 | _AIX | |
| 版本 | _AIX'VR' | V = 版本,R = 修订号 |
| 识别 | TOS_AIX | 由 xlC 定义 |
示例
若定义了 _AIX,则可以使用下面的宏来确定版本。注意,这些宏表示所提及的版本或更高版本。例如,若定义了 _AIX43,那么 _AIX41 也会被定义。
| AIX 版本 | 宏 |
|---|
| 3.2.x | _AIX3_AIX32 |
| 4.1 | _AIX41 |
| 4.3 | _AIX43 |
Android
| 类型 | 宏 | 格式 | 描述 |
|---|
| 识别 | ANDROID | | |
| 版本 | ANDROID_API | V | V = API 版本;必须从 <android/api-level.h> 引入 |
注意:Android 基于 Linux,因此 Android 也会定义 Linux 宏。
示例
| Android 版本 | ANDROID_API |
|---|
| 1.0 | 1 |
| 1.1 | 2 |
| 1.5 | 3 |
| 1.6 | 4 |
| 2.0 | 5 |
| 2.0.1 | 6 |
| 2.1 | 7 |
| 2.2 | 8 |
| 2.3 | 9 |
| 2.3.3 | 10 |
| 3.0 | 11 |
Amdahl UTS
AmigaOS
| 类型 | 宏 | 描述 |
|---|
| 识别 | AMIGA | |
| 识别 | amigaos | 由 GNU C 定义 |
Apollo AEGIS
Apollo Domain/OS
Bada
基于 Nucleus OS。
BeOS
Blue Gene
| 类型 | 宏 | 描述 |
|---|
| 识别 | bg | 所有 Blue Gene 系统;由 XL C/C++ 与 GNU C 定义 |
| 版本 | bgq | Blue Gene/Q;为 XL C/C++ 与 GNU C 定义 |
| 识别 | THW_BLUEGENE | 所有 Blue Gene 系统;由 XL C/C++ 定义 |
| 版本 | TOS_BGQ | Blue Gene/Q;由 XL C/C++ 定义 |
BSD 环境
| 类型 | 宏 | 格式 | 描述 |
|---|
| 识别 | FreeBSD__、NetBSD、OpenBSD、bsdi、__DragonFly | | |
| 版本 | BSD | YYYYMM | YYYY = 年,MM = 月;必须从 <sys/param.h> 引入 |
| 版本 | BSD4_2BSD4_3BSD4_4 | | 必须从 <sys/param.h> 引入 |
| 识别 | _SYSTYPE_BSD | | 由 DEC C 定义 |
示例
| 版本 | BSD | 宏 |
|---|
| 4.3 Net2 | 199103 | |
| 4.4 | 199306 | BSD4_4 |
| 4.4BSD-Lite2 | 199506 | |
BSD/OS
ConvexOS
Cygwin 环境
DG/UX
DragonFly
DYNIX/ptx
eCos
EMX 环境
FreeBSD
| 类型 | 宏 | 格式 | 描述 |
|---|
| 识别 | FreeBSD | | |
| 识别 | FreeBSD_kernel | | 自 FreeBSD 8.3、9.1 与 10.0.1 起 |
| 版本 | BSD | | |
| 版本 | FreeBSD | V | V = 版本 |
| 版本 | __FreeBSD_version | ? | 必须从 osreldate.h 引入 |
示例
| FreeBSD | FreeBSD | __FreeBSD_version |
|---|
| 1.x | 1 | |
| 2.0-RELEASE | 2 | 119411 |
| 2.2-RELEASE | 2 | 220000 |
| 3.0-RELEASE | 3 | 300005 |
| 4.0-RELEASE | 4 | 400017 |
| 4.5-RELEASE | 4 | 450000 |
更多信息参见 FreeBSD 移植手册。
GNU,即 GNU/Hurd
该操作系统的正式名称是 GNU。Hurd 是 GNU 操作系统中的内核。由于还存在 GNU/Linux 与 GNU/kFreeBSD——它们分别是使用 Linux 与 FreeBSD 内核的绝大部分 GNU 操作系统——因此它常被列为 GNU/Hurd。
GNU/kFreeBSD
GNU/kFreeBSD 是基于 FreeBSD 内核而非 Linux 或 Hurd 内核的 Debian 发行版之一。
| 类型 | 宏 |
|---|
| 识别 | FreeBSD_kernel && GLIBC |
注意,FreeBSD 也会定义 __FreeBSD_kernel__,因此必须检查 __GLIBC__ 宏来加以区分。
GNU/Linux
HI-UX MPP
HP-UX
| 类型 | 宏 | 描述 |
|---|
| 识别 | _hpux | 由 HP UPC 定义 |
| 识别 | hpux | |
| 识别 | __hpux | |
IBM OS/400
INTEGRITY
Interix 环境
| 类型 | 宏 | 描述 |
|---|
| 识别 | __INTERIX | 由 GNU C 与 Visual Studio 定义 |
IRIX
Linux 内核
基于 Linux 内核的系统会定义这些宏。主要的基于 Linux 的操作系统有两个:GNU/Linux 与 Android,此外还有许多其他系统,如 Ångström、OpenEmbedded 等。
| 类型 | 宏 | 描述 |
|---|
| 识别 | linux | 1 |
| 识别 | linux | 已废弃(不符合 POSIX) |
| 识别 | __linux | 已废弃(不符合 POSIX) |
LynxOS
MacOS
| 类型 | 宏 | 描述 |
|---|
| 识别 | macintosh | Mac OS 9 |
| 识别 | Macintosh | Mac OS 9 |
| 识别 | APPLE && MACH | Mac OS X;由 GNU C 与 Intel C++ 定义 |
Microware OS-9
| 类型 | 宏 | 描述 |
|---|
| 识别 | __OS9000 | 由 Ultimate C/C++ 定义 |
| 识别 | _OSK | 由 Ultimate C/C++ 定义 |
MINIX
MorphOS
MPE/iX
MSDOS
| 类型 | 宏 |
|---|
| 识别 | MSDOS |
| 识别 | MSDOS |
| 识别 | _MSDOS |
| 识别 | DOS |
NetBSD
| 类型 | 宏 | 格式 | 描述 |
|---|
| 识别 | NetBSD | | |
| 版本 | BSD | | |
| 版本 | NetBSD'V'_'R' | | V = 版本,R = 修订号;必须从 <sys/param.h> 引入 |
| 版本 | NetBSD_Version | VVRRAAPP00 | VV = 版本,RR = 修订号,AA = 发布号,PP = 补丁号;从 NetBSD 1.2D (?) 到 NetBSD 2.0H;必须从 <sys/param.h> 引入 |
| 版本 | NetBSD_Version | VVRR00PP00 | VV = 版本,RR = 修订号,PP = 补丁号;自 NetBSD 2.99.9 起;必须从 <sys/param.h> 引入 |
示例
| NetBSD | NetBSD_Version | 宏 |
|---|
| 0.8 | | NetBSD0_8 |
| 0.9 | | NetBSD0_9 |
| 1.0 | | NetBSD1_0 = 1 |
| 1.0A | | NetBSD1_0 = 2 |
| 1.2D | 102040000 | |
| 1.2.1 | 102000100 | |
NonStop
Nucleus RTOS
OpenBSD
| 类型 | 宏 | 格式 | 描述 |
|---|
| 识别 | OpenBSD | | |
| 版本 | BSD | | |
| 版本 | OpenBSD'V'_'R' | | V = 版本,R = 修订号;必须从 sys/param.h 引入 |
示例
| OpenBSD | 宏 |
|---|
| 3.1 | OpenBSD3_1 |
| 3.9 | OpenBSD3_9 |
OS/2
| 类型 | 宏 |
|---|
| 识别 | OS2 |
| 识别 | _OS2 |
| 识别 | OS2 |
| 识别 | TOS_OS2 |
Palm OS
| 类型 | 宏 | 描述 |
|---|
| 识别 | palmos | 由 PRC-Tools 中的 GNU C 定义 |
Plan 9
Pyramid DC/OSx
QNX
| 类型 | 宏 | 格式 | 描述 |
|---|
| 识别 | QNX | | QNX 4.x |
| 识别 | QNXNTO | | QNX 6.x |
| 版本 | _NTO_VERSION | VRR | V = 版本,RR = 修订号;仅在定义 QNXNTO 时可用;必须从 sys/neutrino.h/ 引入 |
| 版本 | BBNDK_VERSION_CURRENT | VVRRRRPPPP | V = 版本,RRRR = 修订号,PPPP = 补丁号;仅在 Blackberry 10 上可用;自 Blackberry 10.1.0 起;必须从 bbndk.h 引入 |
示例
Reliant UNIX
SCO OpenServer
| 类型 | 宏 | 描述 |
|---|
| 识别 | M_I386 | 由 GNU C 定义 |
| 识别 | M_XENIX | 由 GNU C 定义 |
| 识别 | _SCO_DS | |
Solaris
| 类型 | 宏 | 描述 |
|---|
| 识别 | sun | |
| 识别 | __sun | |
| 版本 | _'System''Version' | System = uname -s,Version = uname -r;任何非法字符都会被替换为下划线;由 Sun Studio 定义 |
可以使用 SVR4 宏来区分 Solaris 与 SunOS。
#if defined(sun) || defined(__sun)
#if defined(__SVR4) || defined(svr4)
/* Solaris */
#else
/* SunOS */
#endif
#endif
示例
| Solaris | 宏 |
|---|
| 2.7 | __SunOS_5_7 |
| 8 | __SunOS_5_8 |
Stratus VOS
注意,__VOS__ 宏由编译器定义,但由于同一 OS 版本中可能共存多个编译器,版本号并不可靠。
SVR4 环境
| 类型 | 宏 | 描述 |
|---|
| 识别 | sysv | |
| 识别 | __SVR4 | |
| 识别 | svr4 | |
| 识别 | _SYSTYPE_SVR4 | 在 IRIX 上定义 |
Syllable
Symbian OS
Tru64 (OSF/1)
Ultrix
| 类型 | 宏 |
|---|
| 识别 | ultrix |
| 识别 | __ultrix |
| 识别 | ultrix |
| 识别 | unix & vax |
UNICOS
| 类型 | 宏 | 格式 | 描述 |
|---|
| 识别 | _UNICOS | | |
| 版本 | _UNICOS | V | V = 版本 |
UNICOS/mp
UNIX 环境
注意,并非所有编译器都定义这些宏,例如 xlC 或 DEC C/C++ 编译器就不定义,因此最好改用 POSIX 或 X/Open 标准宏。
UnixWare
U/Win 环境
VMS
| 类型 | 宏 | 格式 | 描述 |
|---|
| 识别 | VMS | | |
| 识别 | __VMS | | |
| 版本 | __VMS_VER | VVRREPPTT | VV = 版本,RR = 修订号,E = 编辑号,PP = 补丁号(01 = A,... 26 = Z),TT = 类型(22 = 官方) |
示例
| VMS | __VMS_VER |
|---|
| 6.1 | 60100022 |
| 6.2 | 60200022 |
| 6.2-1I | 60210922 |
VxWorks
| 类型 | 宏 | 描述 |
|---|
| 识别 | VXWORKS | 由 GNU C 与 Diab(自 ? 起)定义 |
| 识别 | __vxworks | 由 GNU C 与 Diab(自 ? 起)定义 |
| 版本 | _WRS_VXWORKS_MAJOR | 版本;必须从 version.h 引入 |
| 版本 | _WRS_VXWORKS_MINOR | 修订号;必须从 version.h 引入 |
| 版本 | _WRS_VXWORKS_MAINT | 补丁号/维护版本;必须从 version.h 引入 |
| 模式 | RTP | 用于实时模式 |
| 模式 | _WRS_KERNEL | 用于内核模式 |
示例
| VxWorks | _WRS_VXWORKS_MAJOR | _WRS_VXWORKS_MINOR | _WRS_VXWORKS_MAINT |
|---|
| 6.2 | 6 | 2 | 0 |
Windows
| 类型 | 宏 | 描述 |
|---|
| 识别 | _WIN16 | 为 16 位环境定义 1 |
| 识别 | _WIN32 | 为 32 位与 64 位环境定义 1 |
| 识别 | _WIN64 | 为 64 位环境定义 1 |
| 识别 | WIN32 | 由 Borland C++ 定义 |
| 识别 | TOS_WIN | 由 xlC 定义 |
| 识别 | WINDOWS | 由 Watcom C/C++ 定义 |
Windows CE
| 类型 | 宏 | 格式 | 描述 |
|---|
| 识别 | _WIN32_WCE | | 由 Embedded Visual Studio C++ 定义 |
| 版本 | _WIN32_WCE | VRR | V = 版本,R = 修订号 |
| 识别 | WIN32PLATFORM'P' | | P = 平台 |
| 版本 | WIN32PLATFORM'P' | V | P = 平台,V = 版本 |
示例
| 版本 | _WIN32_WCE |
|---|
| 2.01 | 201 |
| 2.11 | 211 |
| 3.0 | 300 |
| 4.0 | 400 |
| 4.1 | 410 |
| 4.2 | 420 |
| 5.0 | 501 |
| 平台 | 宏 | 值 |
|---|
| H/PC 2000 | WIN32_PLATFORM_HPC2000 | |
| H/PC Pro 2.11 | WIN32_PLATFORM_HPCPRO | 211 |
| H/PC Pro 3.0 | WIN32_PLATFORM_HPCPRO | 300 |
| Pocket PC | WIN32_PLATFORM_PSPC | 1 |
| Pocket PC 2002 | WIN32_PLATFORM_PSPC | 310 |
| Windows Mobile 2003 | WIN32_PLATFORM_PSPC | 400 |
| Smartphone 2002 | WIN32_PLATFORM_WFSP | 100 |
Wind/U 环境
| 类型 | 宏 | 格式 | 描述 |
|---|
| 识别 | _WINDU_SOURCE | | |
| 版本 | _WINDU_SOURCE | 0xVVRRPP | VV = 版本,RR = 修订号,PP = 补丁号 |
示例
| Wind/U | _WINDU_SOURCE |
|---|
| 3.1.2 | 0x030102 |
z/OS
| 类型 | 宏 | 描述 |
|---|
| 识别 | MVS | 主机 |
| 识别 | HOS_MVS | 主机 |
| 识别 | TOS_MVS | 目标 |