代码之家  ›  专栏  ›  技术社区  ›  Kizaru

如何检查当前操作系统是Windows、Linux还是OSX?

  •  4
  • Kizaru  · 技术社区  · 14 年前

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

    #ifdef WIN32
    

    3 回复  |  直到 14 年前
        1
  •  8
  •   Greg Hewgill    14 年前

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

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

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

    gcc -E -dM - </dev/null
    

    #define __FreeBSD__ 8
    

    这恰好意味着我在运行FreeBSDversion8。

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

        2
  •  3
  •   Andy Dent    14 年前

    visual studio预定义宏 this page .

    Sourceforge svn browser

    #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
  •  1
  •   Adonais    14 年前

    这是C预处理器的强大功能。首先,您可以定义宏:

    #define MY_MACRO
    

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

    也就是说里面的代码 #ifdef #endif 只有定义了宏,块才有效。否则它会被忽略 我的意思是你不会写的。

    #ifdef公司 #ifndef . #恩迪夫 两种情况都一样。

    在您的情况下,可以使用宏来更改函数将执行的操作:

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

    …因此,要移植代码,只需要更改宏。