欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

参考连接

  1. vs2019 预定义宏
  2. gcc预定义宏
相关标签: msvc