我需要我的代码根据它被编译的操作系统做不同的事情。我在寻找这样的东西:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
有办法做到这一点吗?有没有更好的方法来做同样的事情?
我需要我的代码根据它被编译的操作系统做不同的事情。我在寻找这样的东西:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
有办法做到这一点吗?有没有更好的方法来做同样的事情?
当前回答
在大多数情况下,最好检查给定的功能是否存在。例如:pipe()函数是否存在。
其他回答
一些编译器会生成#定义来帮助你做到这一点。阅读编译器文档以确定它们是什么。MSVC定义了一个__WIN32__, GCC有一些你可以通过touch foo.h看到;gcc -dM foo.h
显示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
#ifdef _WIN32
// do something for windows like include <windows.h>
#elif defined __unix__
// do something for unix like include <unistd.h>
#elif defined __APPLE__
// do something for mac
#endif
我写了一个小的库来获取你所使用的操作系统,它可以使用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++编译器(MSVC)预定义宏可以在这里找到
我想你正在寻找:
_WIN32 -当编译目标是32位ARM、64位ARM、x86或x64时定义为1。否则,未定义的 _WIN64 -当编译目标是64位ARM或x64时定义为1。否则,未定义。
gcc编译器预定义宏可以在这里找到
我想你正在寻找:
__GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__
为预定义的适当编译器执行谷歌。