#ifdef _WIN32未被检测到

11

我无法让#ifdef规则在Windows上(64位)正常工作。 编译器版本为g++ 5.4.0。 我已经尝试过:

#ifdef _WIN32
#ifdef _WIN64
#ifdef OS_WINDOWS

我用以下命令编译了这个测试程序:

即使是像这样简单的代码:

#include <iostream>

int main()
{
  std::cout << "you are on...";

  #ifdef _WIN32
  std::cout << "Windows" << std::endl;
  #elif __linux__
  std::cout << "Linux" << std::endl;
  #endif

  return 0;
}

输出结果为:

"you are on..."

......其余的都不会被计算在内。


7
运行命令 echo | g++ -dM -E - 来查看您拥有哪些宏定义。 - VLL
2
G++...是MinGW还是Cygwin编译器?据我所知,Cygwin不会设置“_WIN32”,因为它不是Windows环境,而是POSIX环境。 - DevSolar
3
根据文档,对于32位和64位Windows,应定义_WIN32 - DevSolar
2
@AlgirdasPreidžius - _WIN32 是适用于32位和64位Windows的标准。这是一个Windows的特性。 - selbie
1
@DevSolar 哦,我懂了。在检查链接问题的所有已定义变量的完整列表之前,我写了我的评论。谢谢您的纠正 :) - Algirdas Preidžius
显示剩余11条评论
3个回答

11
#ifdef _WIN32
#ifdef _WIN64
这些是由MSVC编译器定义的预定义宏。您似乎正在使用g ++。这可能意味着使用MinGW或Cygwin。

这里这里是由几个编译器预定义的宏集合。

MinGW __MINGW32__

Cygwin __CYGWIN__


如果您不想编写冗长的 #ifdef - #else 树,并在互联网上搜索由晦涩编译器定义的宏及其不同版本,我建议您从 boost 中包含几个头文件。他们已经完成了艰苦的工作。但请注意,BOOST_OS_WINDOWSBOOST_OS_CYGWIN 是分开的。

我感谢大家的帮助和努力。这让我对事情有了更清晰的认识。 - Mikko-Pentti Einari Eronen

3

在cygwin中编译g++时,使用__CYGWIN32__来检测Windows操作系统。(这个宏定义适用于32位和64位版本)。

在这种情况下,_WIN32等宏可能未被定义。对我而言,它就是未定义的。

(正如评论中提到的;使用echo | g++ -dM -E输出已定义的列表可能会有所帮助。)


-2

是的,这是真的:

#ifdef _WIN32

有时在Windows上无法正常工作!这种情况下,请改用以下表单:

#if defined(_WIN32)

我很惊讶,但我见过那个问题,它帮助了我!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接