我需要我的代码根据它被编译的操作系统做不同的事情。我在寻找这样的东西:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
有办法做到这一点吗?有没有更好的方法来做同样的事情?
我需要我的代码根据它被编译的操作系统做不同的事情。我在寻找这样的东西:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
有办法做到这一点吗?有没有更好的方法来做同样的事情?
当前回答
显示GCC在Windows上的定义:
gcc -dM -E - <NUL:
在Linux上:
gcc -dM -E - </dev/null
MinGW中的预定义宏:
WIN32 _WIN32 __WIN32 __WIN32__ __MINGW32__ WINNT __WINNT __WINNT__ _X86_ i386 __i386
在unix系统:
unix __unix__ __unix
其他回答
你可以在编译时使用预处理器指令作为警告或错误检查,你根本不需要运行这个程序,只是简单地编译它。
#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__)
#error Windows_OS
#elif defined(__linux__)
#error Linux_OS
#elif defined(__APPLE__) && defined(__MACH__)
#error Mach_OS
#elif defined(unix) || defined(__unix__) || defined(__unix)
#error Unix_OS
#else
#error Unknown_OS
#endif
#include <stdio.h>
int main(void)
{
return 0;
}
一些编译器会生成#定义来帮助你做到这一点。阅读编译器文档以确定它们是什么。MSVC定义了一个__WIN32__, GCC有一些你可以通过touch foo.h看到;gcc -dM foo.h
我写了一个小的库来获取你所使用的操作系统,它可以使用clib (C包管理器)安装,所以将它作为项目的依赖项使用非常简单。
安装
$ clib install abranhe/os.c
使用
#include <stdio.h>
#include "os.h"
int main()
{
printf("%s\n", operating_system());
// macOS
return 0;
}
它返回一个字符串(char*)与您正在使用的操作系统的名称,有关这个项目的进一步信息,请查看Github上的文档。
很抱歉外部的参考,但我认为它适合你的问题:
C/ c++提示:如何使用编译器预定义的宏检测操作系统类型
操作系统的预定义宏站点有一个非常完整的检查列表。以下是其中的一些,以及它们所在位置的链接:
窗户
_WIN32 32位和64位 _WIN64仅支持64位 __CYGWIN__
Unix (Linux, *BSD,但不包括Mac OS X)
请参阅有关使用此检查的一些陷阱的相关问题。
unix __unix __unix__
Mac OS X
__APPLE__也用于classic __MACH__
两者都有定义;检查两者都可以。
Linux
__linux__ linux过时(不兼容POSIX) __linux过时(不兼容POSIX)
FreeBSD
__FreeBSD__
安卓
__ANDROID__