2009-01-10 40 views

回答

31

[编辑:我假设你想使用编译时宏,以确定你是哪个环境。也许你想确定你是在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”。

A little more info here

0

或许,这将取决于你使用的编译器,但尝试:

#ifdef WIN32 
... 
#endif 
+0

这告诉你,如果你是在windows编译_。问题说“正在运行”,但不清楚OP是否写出他的意思... – dmckee 2009-01-10 03:04:38

+0

必须小心,因为这可能只有在包含windows.h的情况下才能定义。 – 2009-01-10 04:12:37

+0

MSVC++编译器(不是windows.h)为*所有*版本定义_WIN32,因此它是一个更安全的宏来检查。任何针对Win32的交叉编译环境都应该这样设置。 – 2009-01-10 05:08:12

0

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

如果你写的东西完全是平台不可知的(即它只处理打开/读取/处理/写入)文件流..你将不得不做一些测试,如打开一个应该存在的文件,如果计算机运行Windows 。如果你的程序只使用标准的stdio,数学等。这将是这种情况。否则,如果你的代码包含Windows特定的系统调用,那么它根本不会在任何其他平台上运行。

你可以写像一些宏:

#define RUNNING_ON_WINDOWS (... some test) 

只要不使用它的条件编译,即:

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

预处理器常量*可以被信任。即使你从例如gcc在Linux机器上,交叉编译环境将提供预处理器常量,指示预期的* runtime *环境。 – 2009-01-10 05:06:51

2

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

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

在C#下,它比较简单。您可以参考System.Environment.OSVersion,然后查看“平台”。

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

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

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

会做你的[机器具体] G ++编译器,列出所有宏(#定义的)为您自动地定义了很好的工作。

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

+5

如果您不想将临时文件放在后面(用`-xC++`代替`-xc`代替C使用C++的宏),或者只是`gcc -E -xc -dM/dev/null'。 – 2012-07-05 19:12:47

1

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

2

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

17

有许多不同的方法来检测编译,主机和运行时环境。全部取决于你想知道的内容。有三大类型的环境:

  • 构建:这是在程序编译环境。
  • 主机:这是运行程序的环境。
  • 目标:在代码生成工具(如编译器)的情况下,这是生成的代码将运行的位置。

如果你是交叉编译,(构建桌面/服务器应用程序时,这个构建嵌入式应用程序时很常见,但不是很常见)的构建和主机环境可以完全不同,你通常无法运行系统上编译的二进制文件用于编译它。否则,主机环境必须与构建环境兼容:例如,在可在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()等运行时函数(如其他答案中所述)。

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

+2

Cygwin GCC在编译Win32应用程序(它不是Cygwin应用程序)时只定义了`_WIN32`,它有效地作为MinGW编译器,因此`_WIN32`成为一个很好的操作系统检查。 – rubenvb 2011-07-11 15:27:38

5

这三行将帮助您检测,首先我们还是大多数预定义的窗口提示连成一片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 
3

这个东西在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;  
} 
相关问题