我需要我的代码根据它被编译的操作系统做不同的事情。我在寻找这样的东西:

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

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


当前回答

你可以在编译时使用预处理器指令作为警告或错误检查,你根本不需要运行这个程序,只是简单地编译它。

#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__)
    #error Windows_OS
#elif defined(__linux__)
    #error Linux_OS
#elif defined(__APPLE__) && defined(__MACH__)
    #error Mach_OS
#elif defined(unix) || defined(__unix__) || defined(__unix)
    #error Unix_OS
#else
    #error Unknown_OS
#endif

#include <stdio.h>
int main(void)
{
    return 0;
}

其他回答

没有根据C标准设置的标准宏。一些C编译器会在某些平台上设置一个宏(例如,苹果打了补丁的GCC设置了一个宏,以指示它正在苹果系统上编译,并用于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

我在这里没有找到俳句的定义。总的来说,Haiku-os的定义很简单__HAIKU__

你可以在编译时使用预处理器指令作为警告或错误检查,你根本不需要运行这个程序,只是简单地编译它。

#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__)
    #error Windows_OS
#elif defined(__linux__)
    #error Linux_OS
#elif defined(__APPLE__) && defined(__MACH__)
    #error Mach_OS
#elif defined(unix) || defined(__unix__) || defined(__unix)
    #error Unix_OS
#else
    #error Unknown_OS
#endif

#include <stdio.h>
int main(void)
{
    return 0;
}

你可以使用Boost。Predef,其中包含针对目标平台(包括OS)的各种预定义宏(BOOST_OS_*)。是的,boost通常被认为是一个c++库,但这是一个与C一起工作的预处理器头文件!

这个库定义了一组编译器、体系结构、操作系统、库和其他版本号,这些信息来自它可以收集到的C、c++、Objective C和Objective c++预定义宏或在一般可用的头文件中定义的宏。这个库的想法源于一个提议,即扩展Boost Config库,以提供比它所支持的特性定义更多且一致的信息。以下是该简短提案的编辑版本。

例如

#include <boost/predef.h>
// or just include the necessary header
// #include <boost/predef/os.h>

#if   BOOST_OS_WINDOWS
#elif BOOST_OS_ANDROID
#elif BOOST_OS_LINUX
#elif BOOST_OS_BSD
#elif BOOST_OS_AIX
#elif BOOST_OS_HAIKU
...
#endif

完整的列表可以在BOOST_OS操作系统宏中找到

Godbolt演示

参见如何从boost获得平台id ?

使用#define OSsymbol和#ifdef OSsymbol OSsymbol是一个#define'able符号,用于标识目标操作系统。

通常,您将包含一个定义所选OS符号的中央头文件,并使用特定于OS的include和库目录来编译和构建。

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

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