我正在编写一个编译器项目,该项目将产生汇编代码作为目标语言。 但是,根据操作系统,需要考虑一些小的更改,并且我不确定如何检查操作系统。 万一重要,我只关心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的回答有助于解决该问题。 尽管不需要您的回答,但它对其他人还是有帮助的,因此我仍然会赞成。