我想检测我编译的操作系统是否是Windows。有一个简单的宏,我可以检查以验证?是否有任何宏来确定我的代码是否正在编译到Windows?
回答
[编辑:我假设你想使用编译时宏,以确定你是哪个环境。也许你想确定你是在Linux下运行Wine还是在Windows上运行,但是一般来说,你的编译器是针对特定的环境的,这是Windows(DOS)或者不是,但很少(从不?)
某些编译器提供了宏来指示Windows构建环境。但是,如果目标环境是而不是,那么这些将从编译器到编译器,甚至在Windows上的相同编译器中变化。通常是__WIN32__
,但并非总是如此。
#if defined (__WIN32__)
// Windows stuff
#endif
有时也可以是_WIN32
,__CYGWIN32__
,或者可能只是编译器指示器(_MSC_VER
)。
如果你知道你将要建立的环境(来自makefile),那么你通常可以在命令行传递#define
,比如“g++ -D __WIN32__ yourfile.c
”。
或许,这将取决于你使用的编译器,但尝试:
#ifdef WIN32
...
#endif
这告诉你,如果你是在windows编译_。问题说“正在运行”,但不清楚OP是否写出他的意思... – dmckee 2009-01-10 03:04:38
必须小心,因为这可能只有在包含windows.h的情况下才能定义。 – 2009-01-10 04:12:37
MSVC++编译器(不是windows.h)为*所有*版本定义_WIN32,因此它是一个更安全的宏来检查。任何针对Win32的交叉编译环境都应该这样设置。 – 2009-01-10 05:08:12
宏如上面列出的会告诉你,如果你程序在Windows机器上编译,不如果是运行在Windows机器上。
如果你写的东西完全是平台不可知的(即它只处理打开/读取/处理/写入)文件流..你将不得不做一些测试,如打开一个应该存在的文件,如果计算机运行Windows 。如果你的程序只使用标准的stdio,数学等。这将是这种情况。否则,如果你的代码包含Windows特定的系统调用,那么它根本不会在任何其他平台上运行。
你可以写像一些宏:
#define RUNNING_ON_WINDOWS (... some test)
只要不使用它的条件编译,即:
if (RUNNING_ON_WINDOWS) {
...
} else
printf("Windows Required\n");
预处理器常量*可以被信任。即使你从例如gcc在Linux机器上,交叉编译环境将提供预处理器常量,指示预期的* runtime *环境。 – 2009-01-10 05:06:51
到目前为止提到的链接显示在编译时信息。您可以在编译时在这些代码段中设置标志。
但是,我想你所问的更多的是“我正在运行的是哪个版本的Windows?”而不是“我编译为在Windows下运行?我希望这是一个正确的假设。
在C#下,它比较简单。您可以参考System.Environment.OSVersion,然后查看“平台”。
但是,你在问C++。你使用什么编译器?这对你如何检查操作系统版本有很大的影响,因为没有单一的标准来获取这些信息(我已经找到了)。
在Visual C++下,使用Google查找有关GetVersion/GetVersionEx的信息。两者都会为您提供包含程序运行的Windows当前版本信息的结构。
如果您正在运行MS Windows目标代码,您可以调用GetVersion()或GetVersionEx()获取更多信息,并确定您正在运行的Windows变体。
欲了解更多信息范围的MSDN信息。
http://msdn.microsoft.com/en-us/library/ms724451(VS.85).aspx
% touch foo.C ; g++ -dM -E foo.C
会做你的[机器具体] G ++编译器,列出所有宏(#定义的)为您自动地定义了很好的工作。
微软的编译器可能有类似的东西......
如果您不想将临时文件放在后面(用`-xC++`代替`-xc`代替C使用C++的宏),或者只是`gcc -E -xc -dM/dev/null'。 – 2012-07-05 19:12:47
其实我会和环境一起去。 getenv()是一个标准的库函数,因此可能是唯一可行的方法。诀窍是弄清楚哪些变量对所有操作系统都是唯一的。 Windows有ComSpec,appdata,Windir,systemroot和systemdrive,这些都应该设置。您也可以为WINDOWS或WINNT指定路径变量,但这可能不准确。我不是Linux shell/Solaris/MacOS专家,所以其他人可能会告诉你这些操作系统中存在哪些“标准”环境变量。 CygWin也可能导致你一些问题。
的MSVC++编译器(未windows.h
)定义为_WIN32
所有构建,所以它是一个更安全的宏来检查。 MinGW gcc编译器也是。任何针对Win32 的交叉编译环境都应该设置为。
有许多不同的方法来检测编译,主机和运行时环境。全部取决于你想知道的内容。有三大类型的环境:
- 构建:这是在程序编译环境。
- 主机:这是运行程序的环境。
- 目标:在代码生成工具(如编译器)的情况下,这是生成的代码将运行的位置。
如果你是交叉编译,(构建桌面/服务器应用程序时,这个构建嵌入式应用程序时很常见,但不是很常见)的构建和主机环境可以完全不同,你通常无法运行系统上编译的二进制文件用于编译它。否则,主机环境必须与构建环境兼容:例如,在可在Vista上运行的XP上构建应用程序。
C预处理宏不能用来告诉你主机系统的细节(即你正在运行的是什么);他们只能告诉你代码编译的内容。在windows的情况下,最重要的两个宏:
- _WIN32意味着在Win32 API可用。它不会不是告诉你你正在使用哪个编译器,实际上_WIN32是在使用Cygwin的GCC和MinGW的GCC时定义的。因此,不要使用_WIN32来确定是否使用Visual Studio进行编译。
_MSC_VER
告诉你你的程序正在用Microsoft Visual C/C++编译。好吧,差不多。_MSC_VER
是也定义使用英特尔的C++编译器,其目的是作为一个嵌入式替代Visual C++。
在Visual Studio文档中描述了一堆其他宏。
如果您想知道您使用的Windows的确切版本,您必须使用GetVersion()等运行时函数(如其他答案中所述)。
如果您确切地告诉我们您要检查的内容,您可能会得到更具体的答案。
Cygwin GCC在编译Win32应用程序(它不是Cygwin应用程序)时只定义了`_WIN32`,它有效地作为MinGW编译器,因此`_WIN32`成为一个很好的操作系统检查。 – rubenvb 2011-07-11 15:27:38
这三行将帮助您检测,首先我们还是大多数预定义的窗口提示连成一片OS_WIN宏定义:
:#if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BORLANDC__) #define OS_WIN #endif
然后你可以使用预处理的ifdef检查它
#ifdef OS_WIN //Windows specific stuff #else //Normal stuff #endif
这个东西在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;
}
- 1. 是否有编译时func /宏来确定C++ 0x结构是否为POD?
- 2. 确定卷是否是来自代码
- 3. 是否有任何难以反编译的代码示例?
- 4. 我的分离代码是否正确?
- 5. 是否有任何其他方式来编译使用R api的C代码?
- 6. 检查是否verfication代码是正确
- 7. 我用来制作.zip文件的代码是否正确?
- 8. 不能确定这是否是正确的代码?
- 9. 是否有预编译器定义,告诉我我正在编译iOS?
- 10. 是否有任何文件学习使用win32com编码excel宏?
- 11. 是否有任何语言来指定自动代码修改?
- 12. 我对编写伪代码(java)的理解是否正确?
- 13. 如何以编程方式确定Windows是否正在关机?
- 14. 要检查我的代码是否正确与否
- 15. Dojo是否有任何编码标准?
- 16. gcc是否可以不编译代码?
- 17. Firebase的unauth()代码是否正确?
- 18. 是否有用于Windows Workflow 4.0的任何代码covergae工具?
- 19. 是否有gcc宏来确定帧指针没有被消除?
- 20. 是我为java做的循环代码是否正确?
- 21. 是我为sparql执行写的代码是否正确?
- 22. 我的编程逻辑是否正确?
- 23. 我的编程逻辑是否正确?
- 24. 是否可以检索(编程)Windows任务的退出代码?
- 25. 是否有任何可用的XSLT到C++编译器?
- 26. 委托 - 我的代表是否正确?
- 27. C#:是否有任何标准的编译标志,允许我检测是否编译为x86或x64?
- 28. 是否有任何从Visual Studio项目中编译CIL代码的示例
- 29. 此响应是否正确编码?
- 30. 检查PHP编码是否正确
你可能想澄清你是否想知道Windows与Linux与Mac OS X的对比,或者如果你想什么知道Windows XP与Windows Vista对比。 – 2009-01-10 05:13:40