如何使用预处理指令检查操作系统?

309

我希望我的代码能够根据编译所在的操作系统执行不同的功能。我正在寻找类似于以下代码:

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

有没有一种方法可以做到这一点?是否有更好的方法来完成同样的事情?


11
抱歉,这个问题已经在多年前被提出了。 - John_West
这是关于 C 而不是 C++ - ilgaar
如何在C预处理器中可靠地检测Mac OS X、iOS、Linux和Windows? 如何在C、C++中检测Windows或Linux? - phuclv
@CoryKlein 不,那个问题是这个问题的重复。 - Akib Azmain Turja
请参阅CMAKE中特定于操作系统的指令(CMAKE_SYSTEM_NAME)。 - milahu
显示剩余2条评论
17个回答


2
使用#define OSsymbol#ifdef OSsymbol,其中OSsymbol是一个可以进行#define的符号,用于标识目标操作系统。
通常情况下,您需要包含一个中心头文件来定义所选的操作系统符号,并使用操作系统特定的包含目录和库目录来编译和构建。
虽然您没有指定开发环境,但我相当确定您的编译器会提供全局定义常见平台和操作系统的功能。
另请参阅http://en.wikibooks.org/wiki/C_Programming/Preprocessor

1

我在这里没有找到Haiku的定义。为了完整起见,Haiku-os的定义很简单:__HAIKU__


1
#ifdef _WIN32
    std::cout << "Running on Windows" << std::endl;
#elif __linux__
    std::cout << "Running on Linux" << std::endl;
#elif __APPLE__
    std::cout << "Running on macOS" << std::endl;
#else
    std::cout << "Unknown operating system" << std::endl;
#endif

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

0
你可以使用预处理指令作为警告或错误,以在编译时检查程序,而不需要运行该程序,只需简单地进行编译即可。
#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;
}

我不知道为什么这个被踩了。这里有一个很好的想法,不需要运行它来检查准备工作。我想你需要在编译器中启用所有警告。对于gcc,请使用“-Wall”。#warning可能更好,以避免停止编译,但似乎只适用于GCC而不是MSVC。 - not2qubit

0

一些编译器可以生成 #define 来帮助你解决这个问题。阅读编译器的文档以确定它们是什么。MSVC 定义了一个名为 __WIN32__ 的选项,GCC 可以通过 touch foo.h; gcc -dM foo.h 来查看一些选项。


2
gcc: 错误: 无法识别的命令行选项 '--show-defines' gcc: 致命错误: 没有输入文件 编译终止。 - Sebi2020
上面的MSVC链接目前重定向到https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros?redirectedfrom=MSDN&view=msvc-170 - 并列出了一个_WIN32宏,但没有__WIN32__。我还查看了存档版本 - https://web.archive.org/web/20100422132954/http://msdn.microsoft.com:80/en-us/library/b0084kay(VS.80).aspx - 也列出了_WIN32但没有__WIN32__ - AJM

-1

我编写了一个小型库,用于获取您所在的操作系统,它可以使用clib(C包管理器)进行安装,因此非常简单,您可以将其作为项目的依赖项。

安装

$ clib install abranhe/os.c

使用方法

#include <stdio.h>
#include "os.h"

int main()
{
    printf("%s\n", operating_system());
    // macOS
    return 0;
}

它返回一个字符串(char*),其中包含您正在使用的操作系统的名称,有关此项目的更多信息,请查看Github上的文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接