我正在编写一个编译器项目,它将生成汇编代码作为目标语言。但是,根据操作系统的不同,需要考虑一些小的变化,我不确定如何检查操作系统。如果重要,我只关心32位。我在一些源代码中看到过类似
的内容#ifdef WIN32
但我不知道如何运作。
编辑:一些澄清。我在所有三个平台上都使用gcc。我不知道在每个平台中是否通过gcc定义了像WIN32这样的宏。如果是这样,这些常数似乎解决了我的问题。答案 0 :(得分:8)
使用#ifdef
使用预处理程序符号根据定义的符号有条件地编译代码。在您的示例中,编译器或#include
文件可以定义WIN32
,这意味着代码是在Win32环境中编译的。
根据编译器和平台的不同,可能会有不同的预定义符号表示与当前编译环境相关的操作系统或处理器体系结构(以及许多其他可能的事物)。
使用gcc
,您可以使用以下命令行显示预定义符号:
gcc -E -dM - </dev/null
在我的机器上,其中一个已定义的符号为:
#define __FreeBSD__ 8
这恰好意味着我正在运行FreeBSD 8版。
(以上内容适用于C和C系列语言,如C ++。)
答案 1 :(得分:3)
通常,基本的platform-determinign预定义宏由编译器本身定义,通常取决于其他开关。
给定编译器的最佳方法是在其帮助中搜索“预定义宏”或“预定义符号”。例如:googling visual studio预定义宏产生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
答案 2 :(得分: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预处理器”,您将看到所有可以用它们做的事情。