Skip to content

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_APIVV = API 版本;必须从 <android/api-level.h> 引入

注意:Android 基于 Linux,因此 Android 也会定义 Linux 宏。
示例

Android 版本ANDROID_API
1.01
1.12
1.53
1.64
2.05
2.0.16
2.17
2.28
2.39
2.3.310
3.011

Amdahl UTS

类型
识别UTS

AmigaOS

类型描述
识别AMIGA
识别amigaos由 GNU C 定义

Apollo AEGIS

类型
识别aegis

Apollo Domain/OS

类型
识别apollo

Bada
基于 Nucleus OS。

BeOS

类型
识别BEOS

Blue Gene

类型描述
识别bg所有 Blue Gene 系统;由 XL C/C++ 与 GNU C 定义
版本bgqBlue Gene/Q;为 XL C/C++ 与 GNU C 定义
识别THW_BLUEGENE所有 Blue Gene 系统;由 XL C/C++ 定义
版本TOS_BGQBlue Gene/Q;由 XL C/C++ 定义

BSD 环境

类型格式描述
识别FreeBSD__、NetBSD、OpenBSD、bsdi、__DragonFly
版本BSDYYYYMMYYYY = 年,MM = 月;必须从 <sys/param.h> 引入
版本BSD4_2BSD4_3BSD4_4必须从 <sys/param.h> 引入
识别_SYSTYPE_BSD由 DEC C 定义

示例

版本BSD
4.3 Net2199103
4.4199306BSD4_4
4.4BSD-Lite2199506

BSD/OS

类型
识别bsdi

ConvexOS

类型
识别convex

Cygwin 环境

类型
识别CYGWIN

DG/UX

类型
识别DGUX
识别DGUX
识别dgux

DragonFly

类型
识别DragonFly

DYNIX/ptx

类型
识别SEQUENT
识别sequent

eCos

类型
识别__ECOS

EMX 环境

类型
识别EMX

FreeBSD

类型格式描述
识别FreeBSD
识别FreeBSD_kernel自 FreeBSD 8.3、9.1 与 10.0.1 起
版本BSD
版本FreeBSDVV = 版本
版本__FreeBSD_version?必须从 osreldate.h 引入

示例

FreeBSDFreeBSD__FreeBSD_version
1.x1
2.0-RELEASE2119411
2.2-RELEASE2220000
3.0-RELEASE3300005
4.0-RELEASE4400017
4.5-RELEASE4450000

更多信息参见 FreeBSD 移植手册
GNU,即 GNU/Hurd
该操作系统的正式名称是 GNU。Hurd 是 GNU 操作系统中的内核。由于还存在 GNU/Linux 与 GNU/kFreeBSD——它们分别是使用 Linux 与 FreeBSD 内核的绝大部分 GNU 操作系统——因此它常被列为 GNU/Hurd。

类型
识别GNU 1
识别gnu_hurd 1

GNU/kFreeBSD
GNU/kFreeBSD 是基于 FreeBSD 内核而非 Linux 或 Hurd 内核的 Debian 发行版之一。

类型
识别FreeBSD_kernel && GLIBC

注意,FreeBSD 也会定义 __FreeBSD_kernel__,因此必须检查 __GLIBC__ 宏来加以区分。
GNU/Linux

类型
识别gnu_linux

HI-UX MPP

类型
识别__hiuxmpp

HP-UX

类型描述
识别_hpux由 HP UPC 定义
识别hpux
识别__hpux

IBM OS/400

类型
识别OS400

INTEGRITY

类型
识别__INTEGRITY

Interix 环境

类型描述
识别__INTERIX由 GNU C 与 Visual Studio 定义

IRIX

类型
识别sgi
识别__sgi

Linux 内核
基于 Linux 内核的系统会定义这些宏。主要的基于 Linux 的操作系统有两个:GNU/LinuxAndroid,此外还有许多其他系统,如 ÅngströmOpenEmbedded 等。

类型描述
识别linux1
识别linux已废弃(不符合 POSIX)
识别__linux已废弃(不符合 POSIX)

LynxOS

类型
识别Lynx

MacOS

类型描述
识别macintoshMac OS 9
识别MacintoshMac OS 9
识别APPLE && MACHMac OS X;由 GNU C 与 Intel C++ 定义

Microware OS-9

类型描述
识别__OS9000由 Ultimate C/C++ 定义
识别_OSK由 Ultimate C/C++ 定义

MINIX

类型
识别__minix

MorphOS

类型
识别MORPHOS

MPE/iX

类型
识别mpeix
识别__mpexl

MSDOS

类型
识别MSDOS
识别MSDOS
识别_MSDOS
识别DOS

NetBSD

类型格式描述
识别NetBSD
版本BSD
版本NetBSD'V'_'R'V = 版本,R = 修订号;必须从 <sys/param.h> 引入
版本NetBSD_VersionVVRRAAPP00VV = 版本,RR = 修订号,AA = 发布号,PP = 补丁号;从 NetBSD 1.2D (?) 到 NetBSD 2.0H;必须从 <sys/param.h> 引入
版本NetBSD_VersionVVRR00PP00VV = 版本,RR = 修订号,PP = 补丁号;自 NetBSD 2.99.9 起;必须从 <sys/param.h> 引入

示例

NetBSDNetBSD_Version
0.8NetBSD0_8
0.9NetBSD0_9
1.0NetBSD1_0 = 1
1.0ANetBSD1_0 = 2
1.2D102040000
1.2.1102000100

NonStop

类型
识别__TANDEM

Nucleus RTOS

类型
识别nucleus

OpenBSD

类型格式描述
识别OpenBSD
版本BSD
版本OpenBSD'V'_'R'V = 版本,R = 修订号;必须从 sys/param.h 引入

示例

OpenBSD
3.1OpenBSD3_1
3.9OpenBSD3_9

OS/2

类型
识别OS2
识别_OS2
识别OS2
识别TOS_OS2

Palm OS

类型描述
识别palmos由 PRC-Tools 中的 GNU C 定义

Plan 9

类型
识别EPLAN9

Pyramid DC/OSx

类型
识别pyr

QNX

类型格式描述
识别QNXQNX 4.x
识别QNXNTOQNX 6.x
版本_NTO_VERSIONVRRV = 版本,RR = 修订号;仅在定义 QNXNTO 时可用;必须从 sys/neutrino.h/ 引入
版本BBNDK_VERSION_CURRENTVVRRRRPPPPV = 版本,RRRR = 修订号,PPPP = 补丁号;仅在 Blackberry 10 上可用;自 Blackberry 10.1.0 起;必须从 bbndk.h 引入

示例

QNX_NTO_VERSION
6.2620

Reliant UNIX

类型
识别sinux

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
版本VOSVV = 版本

注意,__VOS__ 宏由编译器定义,但由于同一 OS 版本中可能共存多个编译器,版本号并不可靠。
SVR4 环境

类型描述
识别sysv
识别__SVR4
识别svr4
识别_SYSTYPE_SVR4在 IRIX 上定义

Syllable

类型
识别SYLLABLE

Symbian OS

类型
识别SYMBIAN32

Tru64 (OSF/1)

类型
识别osf
识别__osf

Ultrix

类型
识别ultrix
识别__ultrix
识别ultrix
识别unix & vax

UNICOS

类型格式描述
识别_UNICOS
版本_UNICOSVV = 版本

UNICOS/mp

类型描述
识别_CRAY__crayx1

UNIX 环境

类型
识别unix
识别__unix

注意,并非所有编译器都定义这些宏,例如 xlC 或 DEC C/C++ 编译器就不定义,因此最好改用 POSIX 或 X/Open 标准宏。
UnixWare

类型
识别sco
识别_UNIXWARE7

U/Win 环境

类型
识别_UWIN

VMS

类型格式描述
识别VMS
识别__VMS
版本__VMS_VERVVRREPPTTVV = 版本,RR = 修订号,E = 编辑号,PP = 补丁号(01 = A,... 26 = Z),TT = 类型(22 = 官方)

示例

VMS__VMS_VER
6.160100022
6.260200022
6.2-1I60210922

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.2620

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_WCEVRRV = 版本,R = 修订号
识别WIN32PLATFORM'P'P = 平台
版本WIN32PLATFORM'P'VP = 平台,V = 版本

示例

版本_WIN32_WCE
2.01201
2.11211
3.0300
4.0400
4.1410
4.2420
5.0501
平台
H/PC 2000WIN32_PLATFORM_HPC2000
H/PC Pro 2.11WIN32_PLATFORM_HPCPRO211
H/PC Pro 3.0WIN32_PLATFORM_HPCPRO300
Pocket PCWIN32_PLATFORM_PSPC1
Pocket PC 2002WIN32_PLATFORM_PSPC310
Windows Mobile 2003WIN32_PLATFORM_PSPC400
Smartphone 2002WIN32_PLATFORM_WFSP100

Wind/U 环境

类型格式描述
识别_WINDU_SOURCE
版本_WINDU_SOURCE0xVVRRPPVV = 版本,RR = 修订号,PP = 补丁号

示例

Wind/U_WINDU_SOURCE
3.1.20x030102

z/OS

类型描述
识别MVS主机
识别HOS_MVS主机
识别TOS_MVS目标