linux检查编译windows,如何检查当前的操作系统是Windows,Linux还是OSX?

我正在编写一个编译器项目,该项目将产生汇编代码作为目标语言。 但是,根据操作系统,需要考虑一些小的更改,并且我不确定如何检查操作系统。 万一重要,我只关心32位。 我在一些源代码中看到了类似

#ifdef WIN32

但我不知道这是如何/是否有效。

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

您是否打算构建交叉编译器,以便您在Windows上运行的编译器可以为Linux等生成代码?

不。 我只希望它生成可以在当前环境中运行的代码。

如何在C预处理器中可靠地检测Mac OS X,iOS,Linux,Windows?

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

根据编译器和平台的不同,可能会有不同的预定义符号,这些符号表示与当前编译环境有关的操作系统或处理器体系结构(在许多其他可能的事物中)。

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

gcc -E -dM -

在我的机器上,定义的符号之一是:

#define __FreeBSD__ 8

这恰好意味着我正在运行FreeBSD版本8。

(以上内容适用于C和C系列语言,例如C ++。)

谢谢。 这似乎正是我所需要的。 我不知道gcc内的此功能(嗯,至少不知道如何使用它)。

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

给定编译器的最佳方法是在其帮助中搜索"预定义的宏"或"预定义的符号"。例如:谷歌搜索Visual Studio预定义的宏将产生此页面。

我的OOFILE框架涵盖了广泛的系统。 oofplat.h可从Sourceforge svn浏览器获得,并将不同的编译器定义统一为_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

这就是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

}

..so您只需要做的就是移植代码即可更改宏。

宏具有更多实用程序。搜索" C预处理程序",您将看到可以使用它们执行的所有操作。

是的,我了解宏。 我的问题有点不确定-很抱歉。 我不确定用于确定操作系统的宏,但是Greg Hewgills的回答有助于解决该问题。 尽管不需要您的回答,但它对其他人还是有帮助的,因此我仍然会赞成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值