C++ 是否有宏来确定我的代码是否正在编译到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构建环境。但是,如果目标环

我想检测我正在编译的操作系统是否是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的交叉编译环境都应该设置此选项。

有许多不同的方法可以检测编译、主机和运行时环境。这完全取决于你想知道什么。有三大类环境:

  • 编译:这是编译程序的环境
  • 主机:这是运行程序的环境
  • 目标:对于代码生成工具(如编译器),生成的代码将在此处运行
如果进行交叉编译,则生成环境和主机环境可能完全不同(这在生成嵌入式应用程序时很常见,但在生成桌面/服务器应用程序时并不常见),并且通常无法在用于编译的系统上运行编译后的二进制文件。否则,主机环境必须与构建环境兼容:例如,在XP上构建将在Vista上运行的应用程序

C预处理器宏不能用于告诉您主机系统的详细信息(即,您正在运行什么);他们只能告诉您编译代码的目的。在windows情况下,两个最重要的宏是:

  • \u WIN32表示WIN32 API可用。它不会告诉您正在使用哪个编译器,事实上,WIN32是在使用Cygwin的GCC和MinGW的GCC时定义的。因此,不要使用WIN32来判断您是否正在使用visualstudio进行编译
  • \u MSC\u VER
    告诉您该程序正在使用Microsoft Visual C/C++进行编译。嗯,差不多了<代码> < MSCYFLVER /CUT>使用英特尔的C++编译器时,定义为也,它是Visual C++中的一个替换项。
VisualStudio文档中还描述了许多其他宏

% 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;    
}