前言
- C/C++代码实现跨平台编译时,基本上都会调用系统函数,这个时候就可以使用不同系统下的宏定义来实现跨平台的编译。系统主要分为windows,linux和mac。架构主要指的是linux下的架构,常用的有x86,arm和mips架构。
Windows系统宏定义
- windows平台CPU被Intel和AMD二分天下,都是x86架构
- windows系统的宏定义为 _WIN32
Linux系统宏定义
- linux系统的宏定义为 __linux__
- linux系统按照架构又分为 x86架构,arm架构和mips架构
- x86架构芯片主要是Intel和AMD,我们在windows虚拟机上安装的ubuntu和centos等系统,都属于x86架构。国产x86架构的芯片主要是兆芯
- x86架构64位宏定义为 __x86_64__
- x86架构32位宏定义为 __i386__
- arm架构芯片主要有飞腾和鲲鹏
- arm架构宏定义为 __arm__
- mips架构芯片主要有龙芯
- mips架构宏定义为 __mips__
- 编码时,linux系统下一般来说不用区分详细的架构,系统API基本上都是通用了,除非有特殊需求,需要区分架构。
Mac系统宏定义
- mac系统的宏定义为 __APPLE__
- mac系统使用的芯片有Intel,M1,M2,但是由于Mac系统对不同芯片做了很好的兼容,所以在编码时,不用关注mac系统的芯片和架构。直接使用 __APPLE__ 即可。
编码实现
- 可以通过以下宏定义来区分不同平台和架构
-
#ifdef _WIN32 //windows系统 #elif __linux__ #ifdef __x86_64__ //linux系统的x86架构64位 #elif __i386__ //linux系统的x86架构32位 #elif __arm__ //linux系统的arm架构 #elif __mips__ //linux系统的mips架构 #endif #elif __APPLE__ //苹果系统 #else //其他系统 #endif
- 上面使用的宏定义无法使用或语法,因此还有下面这种写法
-
#if defined _WIN32 //windows系统 #elif defined __linux__ #if defined(__x86_64__) || defined(__i386__) //linux系统的x86架构64位或32位 #elif defined __arm__ //linux系统的arm架构 #elif defined __mips__ //linux系统的mips架构 #endif #elif defined __APPLE__ //其他系统 #else //其他系统 #endif