C++ 是否有宏来确定我的代码是否正在编译到Windows?
我想检测我正在编译的操作系统是否是Windows。是否有一个简单的宏可以检查以验证?它可能取决于您使用的编译器,但请尝试:C++ 是否有宏来确定我的代码是否正在编译到Windows?,c++,c,operating-system,c-preprocessor,C++,C,Operating System,C Preprocessor,我想检测我正在编译的操作系统是否是Windows。是否有一个简单的宏可以检查以验证?它可能取决于您使用的编译器,但请尝试: #ifdef WIN32 ... #endif [编辑:我假设您想使用编译时宏来确定您所处的环境。也许您想确定您是在Linux下运行Wine还是在Windows下运行Wine,但通常情况下,您的编译器针对的是特定的环境,即Windows(DOS)环境还是非Windows环境,但很少(永远不会)两者兼而有之。] 有些编译器提供宏来指示Windows构建环境。但是,如果目标环
#ifdef WIN32
...
#endif
[编辑:我假设您想使用编译时宏来确定您所处的环境。也许您想确定您是在Linux下运行Wine还是在Windows下运行Wine,但通常情况下,您的编译器针对的是特定的环境,即Windows(DOS)环境还是非Windows环境,但很少(永远不会)两者兼而有之。]
有些编译器提供宏来指示Windows构建环境。但是,如果目标环境不完全是Windows,则不同的编译器,甚至在Windows上的同一个编译器上,它们都会有所不同。通常是\uuuuu WIN32\uuuuuu
,但并不总是这样
#if defined (__WIN32__)
// Windows stuff
#endif
有时它可能是WIN32、CYGWIN32或编译器指示符(\u MSC\u VER
)
如果您知道要在其中构建的环境(从makefile),那么通常可以在命令行上传入\define
,如“g++-D\uuuu WIN32\uuuuu.yourfile.c
”
上面列出的宏将告诉您程序是否是在Windows计算机上编译的,如果是在Windows计算机上运行的,则不是 如果您编写的内容完全与平台无关(即,它只处理打开/读取/处理/写入)文件流。。如果计算机运行Windows,则必须执行一些测试,例如打开应该存在的文件。如果您的程序仅使用标准stdio、math等。。情况就是这样 否则,如果您的代码包含特定于Windows的系统调用,它将无法在任何其他平台上运行 您可以编写一些宏,如:
#define RUNNING_ON_WINDOWS ( ... some test )
只是不要将其用于条件编译,即:
if (RUNNING_ON_WINDOWS) {
...
} else
printf("Windows Required\n");
到目前为止提到的链接表示编译时的信息。您可以在编译时在这些代码段内设置标志 然而,我认为你问的更多的是“我在哪个版本的windows下运行?”而不是“我是在windows下编译运行的吗?”我希望这是一个正确的假设 在C#下,它相对简单。您可以参考System.Environment.OSVersion,然后在“平台”下查看
但是,您询问的是C++。你在用什么编译器?这对于如何检查操作系统的版本有很大的不同,因为没有一个标准可以获取这些信息(我发现)
在Visual C++中,使用谷歌在GETVIP/GETVIEWONEX中查找信息。两者都将为您提供包含程序运行时所用Windows当前版本信息的结构。
如果您运行的是MS Windows目标代码,您可以调用GetVersion()或GetVersionEx()以获取更多信息,并识别正在运行的Windows的变体 有关更多信息,请查看MSDN信息 将很好地列出[machine specific]g++编译器为您自动定义的所有宏(#define)微软的编译器可能也有类似的东西…事实上,我会选择环境。getenv()是一个标准的库函数,因此可能是实现这一点的唯一可能的可移植方法。诀窍在于找出哪些变量对所有操作系统都是唯一的。Windows有ComSpec、appdata、Windir、systemroot和systemdrive,应进行设置。您也可以为WINDOWS或WINNT str路径变量,但这可能不准确。我不是Linuxshell/Solaris/MacOS专家,所以其他人可能会告诉您这些操作系统中存在哪些“标准”环境变量。CygWin也可能会给您带来一些问题。MSVC++编译器(不是
windows.h
)为所有版本定义\u WIN32
,因此它是一个更安全的宏。mingwgcc编译器也会这样做。任何针对Win32的交叉编译环境都应该设置此选项。有许多不同的方法可以检测编译、主机和运行时环境。这完全取决于你想知道什么。有三大类环境:
- 编译:这是编译程序的环境
- 主机:这是运行程序的环境李>
- 目标:对于代码生成工具(如编译器),生成的代码将在此处运行
- \u WIN32表示WIN32 API可用。它不会告诉您正在使用哪个编译器,事实上,WIN32是在使用Cygwin的GCC和MinGW的GCC时定义的。因此,不要使用WIN32来判断您是否正在使用visualstudio进行编译李>
告诉您该程序正在使用Microsoft Visual C/C++进行编译。嗯,差不多了<代码> < MSCYFLVER /CUT>使用英特尔的C++编译器时,定义为\u MSC\u VER
也,它是Visual C++中的一个替换项。
% touch foo.C ; g++ -dM -E foo.C
#if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BORLANDC__)
#define OS_WIN
#endif
#ifdef OS_WIN
//Windows specific stuff
#else
//Normal stuff
#endif
#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;
}