我正在編寫一個編譯器項目,它將生成彙編代碼作爲目標語言。但是,根據操作系統的不同,有一些小的變化需要考慮,我不確定如何檢查操作系統。如果重要,我只關心32位。我在某些源代碼中看到類似於如何檢查當前的操作系統是Windows,Linux還是OSX?
#ifdef WIN32
但我不知道如何/如果這可行。
編輯:一些澄清。我在所有三個平臺上都使用gcc。我不知道像WIN32這樣的宏是通過gcc在每個平臺上定義的。如果是這樣,這些常量似乎解決了我的問題。
我正在編寫一個編譯器項目,它將生成彙編代碼作爲目標語言。但是,根據操作系統的不同,有一些小的變化需要考慮,我不確定如何檢查操作系統。如果重要,我只關心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