【问题标题】:How to check if the current operating system is Windows, Linux, or OSX?如何检查当前操作系统是 Windows、Linux 还是 OSX?
【发布时间】:2011-04-23 08:42:56
【问题描述】:

我正在编写一个编译器项目,它将生成汇编代码作为目标语言。但是,根据操作系统需要考虑一些小的变化,我不确定如何检查操作系统。万一这很重要,我只关心32位。我在一些源代码中看到过类似

#ifdef WIN32

但我不知道这如何/是否有效。

编辑:一些澄清。我在所有三个平台上都使用 gcc。不知道WIN32之类的宏是不是每个平台都通过gcc定义的。如果是这样,这些常量似乎解决了我的问题。

【问题讨论】:

标签: windows linux macos porting


【解决方案1】:

#ifdef 的使用使用预处理器符号根据定义的符号有条件地编译代码。在您的示例中,编译器或#include 文件可能会定义WIN32,这意味着代码是在Win32 环境中编译的。

根据编译器和平台的不同,可能会有不同的预定义符号表示与当前编译环境相关的操作系统或处理器架构(以及许多其他可能的东西)。

使用gcc,您可以使用以下命令行显示预定义的符号:

gcc -E -dM - </dev/null

在我的机器上,定义的符号之一是:

#define __FreeBSD__ 8

这恰好意味着我运行的是 FreeBSD 版本 8。

(以上适用于 C 和 C 族语言,例如 C++。)

【讨论】:

  • 谢谢。这似乎正是我所需要的。我不知道 gcc 中的这个功能(好吧,至少不知道如何使用它)。
【解决方案2】:

通常,基本平台确定的预定义宏由编译器本身定义,通常取决于其他开关。

给定编译器的最佳方法是在其帮助中搜索“预定义宏”或“预定义符号”。例如:谷歌搜索 visual studio 预定义宏 会产生 this page

我的 OOFILE 框架涵盖了广泛的系统。 oofplat.h 可从Sourceforge svn browser 获得,并将不同的编译器定义统一到 _Windows 等中。

相关部分复制如下。请注意,在区分 Unix 版本时,这是相当无知的,因为编译器没有定义内置函数。

#ifndef _Windows
 #if defined(_WIN32)
  #define _Win32
  #define _Windows
 #elif defined(WIN32)
  #define _Win32
  #define _Windows
 #elif defined(__WIN32__)
  #define _Win32
  #define _Windows
 #elif defined(__Win32__)
  #define _Win32
  #define _Windows
 #elif defined(_WINDOWS)
  #define _Windows
 #elif defined(__INTEL__) && defined(__MWERKS__)
 // Metrowerks CodeWarrior doesn't build anything other than Win32 on INTEL, no DOS
  #define _Windows
  #define _Win32
 #endif
#else
 #if defined __Win32__ || defined _WIN32
  #ifndef _Win32
   #define _Win32
  #endif
 #endif
#endif

#ifndef _MSDOS
 #ifdef _Windows
  #define _MSDOS
 #elif defined(MSDOS)
  #define _MSDOS
 #elif defined(__MSDOS__)
  #define _MSDOS
 #endif
#endif

#ifdef _Windows
 #ifndef STRICT
// some Windows headers define STRICT. In Visual C++ at least having it defined
// affects how static member signatures are mangled, so we define it up front  
  #define STRICT
 #endif
#endif


// if not a DOS machine by now, may be Mac or Unix
// cope with Metrowerks and Symantec (and MPW?)
#ifndef _MSDOS
 #ifndef _Macintosh
  #ifdef macintosh
   #define _Macintosh
  #endif
 #endif
 #ifndef _Macintosh
  #define _Unix
 #endif
#endif

【讨论】:

    【解决方案3】:

    这就是 C 预处理器的强大之处。首先,你可以定义宏:

    #define MY_MACRO
    

    在此之后,您可以检查是否定义了宏:

    #ifdef MY_MACRO
    code, code, code
    code, code, code
    #endif
    

    这意味着 #ifdef#endif 块内的代码只有在定义了该宏时才有效。否则它将被忽略,而 ignored 我的意思是它就像你从未写过它一样。

    #ifdef 的反义词是#ifndef#endif 对这两种情况都是一样的。

    在您的情况下,您可以使用宏来更改函数的功能:

    #define MY_MACRO
    
    void my_function() {
    #ifdef MY_MACRO
        code_for_my_macro();
    #endif
    #ifdef ANOTHER_MACRO
        code_for_another_macro();
    #endif
    }
    

    ..所以移植代码您唯一需要做的就是更改宏。

    宏有更多的实用程序。搜索“C 预处理器”,您会看到可以用它们做什么。

    【讨论】:

    • 是的,我知道宏。我的问题有点不具体——我很抱歉。我不确定用于确定操作系统的宏,但 Greg Hewgill 的回答有助于解决这个问题。虽然不需要你的回答,但它仍然对其他人有帮助,所以我仍然会投票。
    猜你喜欢
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 2017-01-06
    • 2011-02-13
    • 2012-08-29
    • 2011-02-13
    • 1970-01-01
    相关资源
    最近更新 更多