有没有macros来确定我的代码是否被编译到Windows?

我想检测我正在编译的操作系统是否是Windows。 有一个简单的macros,我可以检查来validation?

[编辑:我假设你想使用编译时macros来确定你在哪个环境。 也许你想确定你是在Linux下运行Wine还是在Windows上运行,但是一般来说,你的编译器是针对一个特定的环境的,那就是Windows(DOS)或者不是,但是很less?)都。]

一些编译器提供了macros来指示Windows构build环境。 但是,从编译器到编译器,甚至在Windows上的相同编译器中,如果目标环境不是 Windows专用的,这些将会有所不同。 通常是__WIN32__ ,但并不总是。

 #if defined (__WIN32__) // Windows stuff #endif 

有时它可能是_WIN32__CYGWIN32__ ,或者可能只是编译器指示符( _MSC_VER )。

如果你知道你要build立的环境(来自makefile),那么你通常可以在命令行中input#define ,比如“ g++ -D __WIN32__ yourfile.c ”。

更多信息在这里

有许多不同的方法来检测编译,主机和运行时环境。 一切取决于你想要知道的。 有三种广泛的环境types:

  • 构build :这是程序编译的环境。
  • 主持人 :这是运行程序的环境。
  • 目标 :在代码生成工具(如编译器)的情况下,这是生成的代码将运行的地方。

如果您正在交叉编译 ,构build和主机环境可能会完全不同(构buildembedded式应用程序时这很常见,但在构build桌面/服务器应用程序时不常见),并且通常无法在系统上运行已编译的二进制文件编译它。 否则,主机环境必须与构build环境兼容:例如,在Vista上运行的XP上构build应用程序。

C预处理器macros不能用来告诉你主机系统的细节(即你正在运行的是什么); 他们只能告诉你代码编译的是什么。 在Windows的情况下,两个最重要的macros是:

  • _WIN32表示Win32 API可用。 它不会告诉你你正在使用哪个编译器,实际上_WIN32是在使用Cygwin的GCC和MinGW的GCC时定义的。 所以,不要使用_WIN32来确定是否使用Visual Studio进行编译。
  • _MSC_VER告诉你,你的程序正在用Microsoft Visual C / C ++编译。 好吧,差不多。 使用英特尔的C ++编译器时, _MSC_VER 被定义,该编译器旨在成为Visual C ++的_MSC_VER替代品。

在Visual Studio文档中描述了一堆其他的macros。

如果你想知道你正在使用的Windows的确切版本,你将不得不使用GetVersion()等运行时函数(如其他答案所述)。

如果您确切地告诉我们您要检查的内容,您可能会得到更具体的答案。

 % touch foo.C ; g++ -dM -E foo.C 

将很好的列出你的[machine specific] g ++编译器为你自动定义的所有macros(#define)。

微软的编译器可能有类似的东西

这三行将帮助您检测,首先我们或大多数预定义的窗口一起提示一个OS_WINmacros定义:

 #if defined(_WIN32)|| 定义(WIN32)|| 定义(__ CYGWIN__)|| 定义(__ MINGW32__)|| 定义(__ BORLANDC__)
 #define OS_WIN
 #万一

那么你可以使用预处理器ifdef来检查它:

 #ifdef OS_WIN
 // Windows特定的东西
 #其他
 //普通的东西
 #万一

如果您正在运行MS Windows目标代码,则可以调用GetVersion()或GetVersionEx()获取更多信息,并确定正在运行的Windows的变体。

有关更多信息,请参阅MSDN信息。

http://msdn.microsoft.com/en-us/library/ms724451(VS.85).aspx

这个东西在Visual Studio 2012和其他cgwin的g ++编译器中都有效。 剪切并粘贴它,但通常是一样薄,它所做的就是检测Windows操作系统。 只要应用量化:如果不赢则然后* inux:D享受

 #include <string> #include <iostream> #include <fstream> #include <cstdlib> Using namespace std; int main(){ char chCap; int i = 0; const int MAX_BUFFER = 70; char buffer[MAX_BUFFER]; string cmd="ver"; FILE *stream = _popen(cmd.c_str(), "r"); if (0 != stream){ while (!feof(stream)){ //One way is here //chCap = fgetc(stream); //cout << chCap; //buffer[i++] = chCap; //This one seams better fgets(buffer, MAX_BUFFER, stream); } _pclose(stream); } cout << endl; cout << buffer << endl; //The op sys detection starts here string opSys(buffer); //char array to string if("Microsoft" == opSys.substr(0,9)){ cout << "You are in a Microsoft envornment " << endl; } system("pause"); return 0; } 

到目前为止所提到的链接指出了编译时的信息。 您可以在编译时在这些代码段中设置标志。

不过,我想你所问的更多的是“我正在运行的是哪个版本的Windows?”而不是“我编译的是在Windows下运行? 我希望这是一个正确的假设。

在C#下,它比较简单。 你可以引用System.Environment.OSVersion,然后在“Platform”下查找。

不过,你在问C ++。 你使用什么编译器? 这对于如何检查操作系统版本有很大的影响,因为没有单一的标准来获取这些信息(我已经find了)。

在Visual C ++下,使用Google查找GetVersion / GetVersionEx上的信息。 两者都会为您提供包含该程序正在运行的当前Windows版本信息的结构。

MSVC ++编译器(不是windows.h )为所有版本定义_WIN32 ,所以它是一个更安全的macros来检查。 MinGW gcc编译器也是。 任何针对Win32的交叉编译环境都应该这样设置。

其实我会和环境一起去的。 getenv()是一个标准的库函数,所以可能是唯一可能的便携方式。 诀窍是弄清楚哪些variables是所有操作系统唯一的。 Windows有ComSpec,appdata,Windir,systemroot和systemdrive应该设置。 您也可以为WINDOWS或WINNT标记pathvariables,但这可能不准确。 我不是Linux shell / Solaris / MacOS专家,所以其他人可能会告诉你这些操作系统中存在什么“标准”的环境variables。 CygWin也可能导致你一些问题。

这可能取决于您正在使用的编译器,但请尝试:

 #ifdef WIN32 ... #endif 

上面列出的macros会告诉你,如果你的程序是在Windows机器上编译的而不是在Windows机器上运行

如果你写的东西是完全平台不可知的(即它只处理打开/读取/处理/写入)文件stream..你将不得不做一些testing,如打开一个文件,如果计算机运行Windows应该存在。 如果你的程序只使用标准的stdio,math等。这将是这种情况。

否则,如果你的代码包含Windows特定的系统调用,那么它根本不会在任何其他平台上运行。

你可以写一些macros,如:

 #define RUNNING_ON_WINDOWS ( ... some test ) 

只是不要使用它进行条件编译,即:

 if (RUNNING_ON_WINDOWS) { ... } else printf("Windows Required\n");