2010-10-10 35 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 
相關問題