gcc宏区分Win和Linux
程序员文章站
2022-05-06 19:09:04
...
C标准没有定义用来识别操作系统的宏,只能检测各个编译器自带的宏定义
要做跨平台编译,gcc跨Linux/Windows/Mac平台,所以这里只说gcc编译器下怎么区分操作系统
- 可以用以下命令行获取GCC定义的预编译宏:
$ < /dev/null gcc - -march=i386 -dM -E < /dev/null | sort (i386可替换为arm64等)
$ gcc -c -Q --help=target | grep -A2 -E 'valid.*march=' # 查看-march=后可用的参数
样板代码
区分操作系统
简单区分
//
#if __linux__ // 是linux系统
#elif __unix__ // unix 系统
#elif _WIN32 || _WIN64 // 是windows系统
#else
#error "Unkown platform!"
#endif
详细区分
#ifdef _WIN32
//define something for Windows (32-bit and 64-bit, this part is common)
#ifdef _WIN64
//define something for Windows (64-bit only)
#else
//define something for Windows (32-bit only)
#endif
#elif __APPLE__
#include "TargetConditionals.h"
#if TARGET_IPHONE_SIMULATOR
// iOS Simulator
#elif TARGET_OS_IPHONE
// iOS device
#elif TARGET_OS_MAC
// Other kinds of Mac OS
#else
# error "Unknown Apple platform"
#endif
#elif __ANDROID__
// android
#elif __linux__
// linux
#elif __unix__ // all unices not caught above
// Unix
#elif defined(_POSIX_VERSION)
// POSIX
#else
# error "Unknown compiler"
#endif
查看这些宏
##1. MSYS
$ echo | cpp -dM | grep -i inux # cpp -dM 等效于 gcc -E -dM
$ echo | cpp -dM | sort | uniq | grep -i win
#define __CYGWIN__ 1
#define __SIZEOF_WINT_T__ 4
#define __WINT_MAX__ 0xffffffffU
#define __WINT_MIN__ 0U
#define __WINT_TYPE__ unsigned int
#define __WINT_WIDTH__ 32
##2. MinGW64
$ echo | cpp -dM | grep -i inux
$ echo | cpp -dM | grep -i win
#define _WIN32 1
#define _WIN64 1
#define __WIN32 1
#define __WIN64 1
#define __WINNT 1
#define __WINNT__ 1
#define __WIN32__ 1
#define WIN32 1
#define WIN64 1
#define WINNT 1
#define __WIN64__ 1
## 3. MSYS, MinGW-32bit
$ gcc -dumpmachine
i686-w64-mingw32
$ $ < /dev/null gcc - -E -dM | sort | uniq | grep -i win
#define __SIZEOF_WINT_T__ 2
#define __WIN32 1
#define __WIN32__ 1
#define __WINNT 1
#define __WINNT__ 1
#define __WINT_MAX__ 0xffff
#define __WINT_MIN__ 0
#define __WINT_TYPE__ short unsigned int
#define __WINT_WIDTH__ 16
#define _WIN32 1
#define WIN32 1
## 4. Linux, CentOS7
$ gcc -dumpmachine
x86_64-pc-linux-gnu
$ echo | cpp -dM | grep -i win
$ echo | cpp -dM | grep -i inux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1
区分编译器
#if defined (__GNUC__) // gcc
#elif defined (_MSC_VER)
#endif
__GNUC__
_MSC_VER
参考连接
推荐阅读
-
linux软件开发时给gcc指定头文件和库文件路径的方法
-
让Linux系统和Win8一模一样!超华丽Linux仿Win8主题下载
-
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
-
在win10和linux上分别安装Python虚拟环境的方法步骤
-
Linux系统中安装gcc和kernel-devel的方法
-
python库lxml在linux和WIN系统下的安装
-
linux软件开发时给gcc指定头文件和库文件路径的方法
-
让Linux系统和Win8一模一样!超华丽Linux仿Win8主题下载
-
Linux折腾记(八):使用GCC和GNU Binutils编写能在x86实模式运行的16位代码
-
set_include_path在win和linux下的区别