如何检查当前的操作系统是Windows,Linux还是OSX?
我正在编写一个编译器项目,它将生成汇编代码作为目标语言。但是,根据操作系统的不同,有一些小的变化需要考虑,我不确定如何检查操作系统。如果重要,我只关心32位。我在某些源代码中看到类似于如何检查当前的操作系统是Windows,Linux还是OSX?
#ifdef WIN32
但我不知道如何/如果这可行。
编辑:一些澄清。我在所有三个平台上都使用gcc。我不知道像WIN32这样的宏是通过gcc在每个平台上定义的。如果是这样,这些常量似乎解决了我的问题。
#ifdef
的使用使用预处理器符号根据定义的符号有条件地编译代码。在您的示例中,编译器或#include
文件可能会定义WIN32
,这意味着代码正在Win32环境中编译。
根据编译器和平台的不同,可能会有不同的预定义符号,它们表示与当前编译环境相关的操作系统或处理器体系结构(以及许多其他可能的情况)。
gcc -E -dM - </dev/null
在我的机器,定义的标志之一是:
随着gcc
,您使用以下命令行可以显示预定义的符号
#define __FreeBSD__ 8
这种情况意味着我运行FreeBSD版本8.
(以上适用于C和C族语言,如C++)。
谢谢。这似乎正是我需要的。我没有意识到gcc内部的这个功能(好吧,至少不知道如何使用它)。 – Kizaru 2010-10-10 02:49:19
这是C预处理器的强大功能。首先,在所有的,你可以定义宏:
#define MY_MACRO
在此之后,你可以检查宏定义:
#ifdef MY_MACRO
code, code, code
code, code, code
#endif
这意味着内部#ifdef
和#endif
块代码将是有效的只有当宏被定义。否则它会被忽略,忽略我的意思是它会像你从来没有写过它。
与#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的回答有助于解决这个问题。虽然你的答案不需要,但对其他人仍然有帮助,所以我仍然会对它投票。 – Kizaru 2010-10-10 03:02:58
通常,基本的平台确定预定义宏由编译器本身定义,通常取决于其他开关。对于给定的编译器
最好的办法是寻找在他们的帮助“预定义宏”或“预定义的符号”。例如:谷歌搜索视觉工作室预定义的宏产量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
您是否打算构建一个交叉编译器,以便在Windows上运行的编译器可以为Linux等生成代码? – 2010-10-10 02:39:29
没有。我只希望它生成可以在当前环境中运行的代码。 – Kizaru 2010-10-10 02:41:12