在C++中检测Windows操作系统

9

如何在C++/C中检测操作系统是否为Windows?


你是如何编译出与多个操作系统兼容的二进制代码的? - Cody Gray
你是在问编译时间还是运行时? - wkl
运行时,程序运行时 - Daniel
1
考虑到您需要构建在Windows上运行的代码,而这与您为Linux、Mac、FreeBSD等构建的二进制文件不兼容,因此您根本不需要这样做。从您的其他评论中可以看出,您真正想要的是在编译时确定构建专门针对Windows的代码。 - wkl
当您将程序编译为“本地代码”(特定于 CPU 的机器代码)时,通常必须针对能够运行生成的可执行文件的特定操作系统(通常还包括版本)进行编译。这与像 Ruby 或 Java 这样的解释性语言不同,其中存在本地代码程序来读取源代码或代表程序的表示形式(“字节码”)。尽管如此,您仍然可以编译 Windows 程序并在 Windows 模拟器(例如 Linux 的 WINE)下运行它,这是您想要认识到的吗? - Tony Delroy
你不能在运行时这样做,因为编译的过程会为特定平台创建代码。它只能在其他平台上重新编译后才能运行。因此,你的 Windows 程序始终在 Windows 上运行,否则它根本就无法运行。 - Karl Knechtel
3个回答

38
#ifdef _WIN32
cout << "This is Windows." << endl;
#endif

只要定义了预处理器宏,这将允许您仅为Windows定义块。

这是编译时的事情,而不是运行时的事情。


3
这能在64位Windows上运行吗?我当然可以测试,但也许值得编辑答案以便未来的读者。 - Tony

2
您可以像这样使用cstdlib中的getenv()函数:
#include <cstdlib>

getenv("windir");

如果你得到的是NULL,那么它就不是Windows系统。
这个方法有效是因为%windir%应该只在Windows系统上定义。当然,这是一种简单而粗暴的方法。 http://www.cplusplus.com/reference/clibrary/cstdlib/getenv/

6
我相当确定这样做是不好的。 - Cam
这是一个hack。你也可以使用getenv("OS")并检查"Windows"和"Windows_NT",但这需要一些内存处理。还有其他正式的方法,但这个函数应该是标准C库的一部分。 - Jeremy Edwards
16
我可以在 Linux 上定义 windir… - Thomas Eding

0

如果是运行时,您可能指的是在非Windows操作系统上运行Wine。如果不是这样,那就根本不可能。Windows二进制文件无法在其他操作系统中运行(除非它们有Wine)。

如果是编译时,可能是重复问题:是否有任何宏来确定我的代码是被编译到Windows中?

(请参考上面接受的答案)


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