当前位置:  开发笔记 > 编程语言 > 正文

如何使用预处理程序指令检查OS?

如何解决《如何使用预处理程序指令检查OS?》经验,为你挑选了6个好方法。

我需要我的代码根据编译它的操作系统做不同的事情.我正在寻找这样的东西:

#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif

有没有办法做到这一点?有没有更好的方法来做同样的事情?



1> Lambda Fairy..:

OS网站的预定义宏具有非常完整的检查列表.以下是其中一些内容,以及指向它们的位置的链接:

视窗

_WIN32   32位和
_WIN64   64位仅64位

Unix(Linux,*BSD,Mac OS X)

有关使用此检查的一些缺陷,请参阅此相关问题.

unix
__unix
__unix__

Mac OS X.

__APPLE__
__MACH__

两者都是定义的; 检查要么应该工作.

Linux的

__linux__
linux 已过时(不符合POSIX)
__linux已过时(不符合POSIX标准)

FreeBSD的

__FreeBSD__



2> 小智..:

显示GCC在Windows上定义:

gcc -dM -E - 

在Linux上:

gcc -dM -E - 

MinGW中的预定义宏:

WIN32 _WIN32 __WIN32 __WIN32__ __MINGW32__ WINNT __WINNT __WINNT__ _X86_ i386 __i386

在UNIX上:

unix __unix__ __unix



3> PADYMKO..:

基于nadeausoftware和Lambda Fairy的回答.

#include 

/**
 * Determination a platform of an operation system
 * Fully supported supported only GNU GCC/G++, partially on Clang/LLVM
 */

#if defined(_WIN32)
    #define PLATFORM_NAME "windows" // Windows
#elif defined(_WIN64)
    #define PLATFORM_NAME "windows" // Windows
#elif defined(__CYGWIN__) && !defined(_WIN32)
    #define PLATFORM_NAME "windows" // Windows (Cygwin POSIX under Microsoft Window)
#elif defined(__ANDROID__)
    #define PLATFORM_NAME "android" // Android (implies Linux, so it must come first)
#elif defined(__linux__)
    #define PLATFORM_NAME "linux" // Debian, Ubuntu, Gentoo, Fedora, openSUSE, RedHat, Centos and other
#elif defined(__unix__) || !defined(__APPLE__) && defined(__MACH__)
    #include 
    #if defined(BSD)
        #define PLATFORM_NAME "bsd" // FreeBSD, NetBSD, OpenBSD, DragonFly BSD
    #endif
#elif defined(__hpux)
    #define PLATFORM_NAME "hp-ux" // HP-UX
#elif defined(_AIX)
    #define PLATFORM_NAME "aix" // IBM AIX
#elif defined(__APPLE__) && defined(__MACH__) // Apple OSX and iOS (Darwin)
    #include 
    #if TARGET_IPHONE_SIMULATOR == 1
        #define PLATFORM_NAME "ios" // Apple iOS
    #elif TARGET_OS_IPHONE == 1
        #define PLATFORM_NAME "ios" // Apple iOS
    #elif TARGET_OS_MAC == 1
        #define PLATFORM_NAME "osx" // Apple OSX
    #endif
#elif defined(__sun) && defined(__SVR4)
    #define PLATFORM_NAME "solaris" // Oracle Solaris, Open Indiana
#else
    #define PLATFORM_NAME NULL
#endif

// Return a name of platform, if determined, otherwise - an empty string
const char *get_platform_name() {
    return (PLATFORM_NAME == NULL) ? "" : PLATFORM_NAME;
}

int main(int argc, char *argv[]) {
    puts(get_platform_name());
    return 0;
}

通过GCC和clang测试:

Debian 8

Windows(MinGW)

Windows(Cygwin)



4> quinmars..:

在大多数情况下,最好检查是否存在给定的功能.例如:如果函数pipe()存在与否.


有没有一种简单的方法来检查是否定义了一个函数?

5> Arjun Sreedh..:
#ifdef _WIN32
// do something for windows like include 
#elif defined __unix__
// do something for unix like include 
#elif defined __APPLE__
// do something for mac
#endif



6> Martin York..:
可以在此处找到MS编译器PreDefined Macros:

http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx

我想你正在寻找:

_WIN32
_WIN64

gcc编译器PreDefined MAcros可以在这里找到:

http://gcc.gnu.org/onlinedocs/cpp/Predefined-Macros.html

我想你正在寻找:

__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__

为您预先定义的适当编译器做谷歌.

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有