C/C++中的操作系统自动检测

6
有没有办法通过C/C++代码自动检测您的操作系统?我需要为Linux、Windows甚至树莓派运行一些跨平台代码。我正在尝试自动检测操作系统,以便不必询问机器上运行的操作系统作为输入。
我在想像验证文件系统结构之类的黑客攻击,但我不知道是否正确。

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Mats Petersson
1
在 POSIX 系统上,如果您正在本地构建(没有交叉编译),则可以在构建命令中使用 uname - Basile Starynkevitch
2
你想要一个二进制文件,可以在几个不同的操作系统上神奇地执行,然后在运行时检测它正在运行的操作系统?不可能。我认为C++可能不是解决你问题的正确方案,无论它是什么。 - Christian Hackl
2个回答

7

我过去使用过以下代码来检查Linux和Windows之间的差异

#include<stdio.h>

int main(int argc, char *argv[])
{

#ifdef _WIN32
   printf("in Windows");
#endif

#ifdef linux
    printf("In Linux");
#endif

    return 0;
}

通常所有的工具链都有它们自己预定义的宏,因此您需要使用这些宏来检测这个操作系统。
以下是这些预定义宏的列表。

http://sourceforge.net/p/predef/wiki/OperatingSystems/


作为一个附注,这里使用编译时宏来检测操作系统。因此,根据工具链,相应的宏定义将在构建中进行。
要在运行时检测操作系统版本,就像在Java中一样。
System.getProperty("os.name")

同样的,在C/C++中我们没有任何API。


在使用“uname”的POSIX系统中,我们可以获取操作系统名称。

这不是 OP 要求的自动检测,而是条件构建。 - George André
@GeorgeAndré 有什么区别? - fuz
1
@FUZxxl,这里我们是在编译时检测操作系统,而不是在运行时。 - Jeegar Patel
@JeegarPatel,这不是OP想要的方式吗? - fuz
然而,POSIX系统有uname函数来查询操作系统。 - Basile Starynkevitch
显示剩余3条评论

5

有一个方便的列表(请将其保存到磁盘!)。列表中包含预定义编译器宏

我还建议,如果你正在针对多个平台进行开发,请寻找已经适用于这些平台的库。


1
顺便说一下,QtPOCO 都是值得研究的跨平台 C++ 库。 - Basile Starynkevitch

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