如何使用预处理指令检查OS?

时间:2020-03-06 14:48:52  来源:igfitidea点击:

我需要我的代码根据要在其上进行编译的操作系统来执行不同的操作。我正在寻找这样的东西:

#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif

有没有办法做到这一点?有没有更好的方法来做同样的事情?

解决方案

一些编译器会生成#defines来。阅读编译器文档以确定它们是什么。 MSVC定义了一个" __WIN32 __",GCC可以通过" touch foo.h"看到一些内容。 gcc -dM foo.h`

使用#define OSsymbol#ifdef OSsymbol
其中OSsymbol是可识别目标操作系统的" #define"符号。

通常,我们将包括定义所选OS符号的中央头文件,并使用特定于OS的包含目录和库目录进行编译和构建。

我们没有指定开发环境,但是我很确定编译器为通用平台和操作系统提供了全局定义。

另请参见http://en.wikibooks.org/wiki/C_Programming/Preprocessor

在大多数情况下,最好检查是否存在给定的功能。例如:函数pipe()是否存在。

http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx

我认为我们正在寻找:

_WIN32

  _WIN64
http://gcc.gnu.org/onlinedocs/cpp/Predefined-Macros.html

我认为我们正在寻找:

__GNUC__

  __GNUC_MINOR__

  __GNUC_PATCHLEVEL__

为我们预定义的适当编译器创建一个google。

没有根据C标准设置的标准宏。一些C编译器会在某些平台上设置一个(例如,Apple修补的GCC设置了一个宏,以指示它正在Apple系统上进行编译并用于Darwin平台)。平台和/或者C编译器可能也会进行设置,但是没有通用的方法。

像hayalci所说,最好以某种方式在构建过程中设置这些宏。使用大多数编译器定义宏很容易,而无需修改代码。我们只需将-D MACRO传递给GCC,即

gcc -D Windows
gcc -D UNIX

并在代码中:

#if defined(Windows)
// do some cool Windows stuff
#elif defined(UNIX)
// do some cool Unix stuff
#else
#    error Unsupported operating system
#endif

在Windows上显示GCC定义:

gcc -dM -E - <NUL:

在Linux上:

gcc -dM -E - </dev/null

MinGW中的预定义宏:

WIN32 _WIN32 __WIN32 __WIN32__ __MINGW32__ WINNT __WINNT __WINNT__ _X86_ i386 __i386

在UNIX上:

unix __unix__ __unix