有没有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");