2010-10-10 106 views
4

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

#ifdef WIN32 

但我不知道如何/如果这可行。

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

+0

您是否打算构建一个交叉编译器,以便在Windows上运行的编译器可以为Linux等生成代码? – 2010-10-10 02:39:29

+0

没有。我只希望它生成可以在当前环境中运行的代码。 – Kizaru 2010-10-10 02:41:12

回答

8

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

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

gcc -E -dM - </dev/null 

在我的机器,定义的标志之一是:

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

#define __FreeBSD__ 8 

这种情况意味着我运行FreeBSD版本8.

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

+0

谢谢。这似乎正是我需要的。我没有意识到gcc内部的这个功能(好吧,至少不知道如何使用它)。 – Kizaru 2010-10-10 02:49:19

1

这是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预处理器”,你会看到你可以用它们做的所有事情。

+0

是的,我知道宏。我的问题有点不确定 - 我很抱歉。我不确定用于确定操作系统的宏,但是Greg Hewgill的回答有助于解决这个问题。虽然你的答案不需要,但对其他人仍然有帮助,所以我仍然会对它投票。 – Kizaru 2010-10-10 03:02:58

2

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

最好的办法是寻找在他们的帮助“预定义宏”或“预定义的符号”。例如:谷歌搜索视觉工作室预定义的宏产量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 
相关问题