是否可以检查是否使用Microsoft C编译器构建64位?

dre*_*lax 9 c windows 64-bit visual-c++

是否有为64位版本定义的简单预处理器宏?我认为_WIN64可能是它,但即使我构建一个32位目标,包含在a #ifdef _WIN64 ... #endif中的部分也会编译进来,这会导致问题.这是周五,我不能直接思考,但我确信我在这里忽略了一些非常简单的事情.甚至一些涉及sizeof.

Bru*_*kin 18

我一直使用_WIN64来检查它是否是64位版本.

NB _WIN32也始终(自动)由64位版本中的MSVC定义,因此在检查_WIN32之前检查_WIN64:

#if defined( _WIN64 )

// Windows 64 bit code here

#elif defined( _WIN32 )

// Windows 32 bit code here

#else

// Non-Windows code here

#endif
Run Code Online (Sandbox Code Playgroud)


Mic*_*urr 10

听起来你的问题可能与标题或项目设置不正确的定义有关_WIN64- 应留给编译器.

WIN64和之间有一个微妙的区别_WIN64(至少对于Microsoft编译器 - 其他编译器应该效仿,但并非所有编译器都这样做):

  • _WIN64编译器在为Windows 64位平台构建程序时定义.请注意,此名称位于编译器实现者的命名空间中(前导下划线后跟大写字母)
  • WIN64在定位64位平台时,由Windows平台SDK(或他们今年称之为的任何东西)定义.

因此,如果您只包含标准标题并且不采取其他措施来定义它,WIN64不会定义.

有一个类似的故事_WIN32WIN32- 但检查其他编译器:GCC 3.4.5确实定义WIN32即使只使用标准头.和数字火星一样.

微软的编译器和Comeau没有.

另一点(希望)众所周知的琐事是,_WIN32并且WIN32在针对64位Windows平台时设置.否则会有太多东西破碎.


小智 8

Visual C++编译器定义以下宏:

  • _M_IX86 - x86平台
  • _M_IA64 - ia64平台
  • _M_X64 - x64平台

  • 但是,如果Windows是目标,几乎总是应该使用`_WIN64` /`WIN64` /`_WIN32` /`WIN32` - 只有当你真的需要处理特定于处理器的差异时才应该使用你提到的定义(应该是罕见的)而不是OS平台的差异(更常见).如果`_WIN64`在32位版本中设置不正确,则应该修复问题而不是绕过问题. (4认同)