我想检测我正在编译的操作系统是否是Windows.是否有一个简单的宏我可以检查以验证?
[编辑:我假设您要使用编译时宏来确定您所在的环境.也许你想确定你是在Linux下运行Wine还是在Windows上运行,但一般情况下,你的编译器针对的是特定的环境,那就是Windows(DOS)或者不是,但它很少(从来没有) ?)两个.]
一些编译器提供宏来指示Windows构建环境.但是这些因编译器而异,如果目标环境不仅仅是 Windows,甚至在Windows上的相同编译器也是如此.通常是__WIN32__
,但并非总是如此.
#if defined (__WIN32__) // Windows stuff #endif
有时它可能是_WIN32
,__CYGWIN32__
或者可能只是编译器指示符(_MSC_VER
).
如果您知道要构建的环境(来自makefile),那么通常可以#define
在命令行中传入,如" g++ -D __WIN32__ yourfile.c
".
这里有更多信息
有许多不同的方法可以检测编译,主机和运行时环境.一切都取决于你想知道什么.有三种类型的环境:
构建:这是编译程序的环境.
主机:这是运行程序的环境.
目标:在代码生成工具(例如编译器)的情况下,这是生成的代码将运行的位置.
如果您是交叉编译,那么构建和宿主环境可能完全不同(这在构建嵌入式应用程序时很常见,但在构建桌面/服务器应用程序时不常见),并且您通常无法在以前使用的系统上运行已编译的二进制文件编译它.否则,主机环境必须与构建环境兼容:例如,在XP上构建将在Vista上运行的应用程序.
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()(如其他答案中所述).
如果您确切地告诉我们您要检查的内容,您可能会得到更具体的答案.
% touch foo.C ; g++ -dM -E foo.C
能很好地列出[机器特定的] g ++编译器为您自动定义的所有宏(#define).
微软的编译器可能有类似的东西......
这三行将帮助您检测,首先我们或大多数预定义的窗口提示一起成为一个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