windows 是否可以检查您是否正在使用 Microsoft C 编译器为 64 位构建?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1647930/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Is it possible to check whether you are building for 64-bit with Microsoft C Compiler?
提问by dreamlax
Is there a simple preprocessor macro that is defined for a 64-bit build? I thought _WIN64
might have been it, but even when I build a 32-bit target, the parts enclosed in a #ifdef _WIN64 ... #endif
are compiled in, and this is causing problems. It's Friday and I can't think straight, but I'm sure I'm overlooking something very simple here. Maybe even something involving sizeof
.
是否有为 64 位构建定义的简单预处理器宏?我想_WIN64
可能是这样,但即使我构建了一个 32 位目标,包含在 a#ifdef _WIN64 ... #endif
中的部分也会被编译,这会导致问题。今天是星期五,我无法直接思考,但我确定我在这里忽略了一些非常简单的事情。甚至可能涉及sizeof
.
回答by Bruce Ikin
I have always used _WIN64 to check if it is a 64 bit build.
我一直使用 _WIN64 来检查它是否是 64 位版本。
N.B. _WIN32 is also always (automatically) defined by MSVC in 64 bit builds, so check for _WIN64 before you check for _WIN32:
注意 _WIN32 也总是(自动)由 MSVC 在 64 位版本中定义,因此在检查 _WIN32 之前检查 _WIN64:
#if defined( _WIN64 )
// Windows 64 bit code here
#elif defined( _WIN32 )
// Windows 32 bit code here
#else
// Non-Windows code here
#endif
回答by Michael Burr
It sounds like your problem might be related to a header or project setting improperly defining _WIN64
- that should be left to the compiler.
听起来您的问题可能与不正确定义的标头或项目设置有关_WIN64
- 这应该留给编译器。
There's a subtle difference between WIN64
and _WIN64
(at least for the Microsoft compilers - other compilers should follow suit, but not all do):
WIN64
和_WIN64
( 至少对于 Microsoft 编译器 - 其他编译器应该效仿,但并非所有人都这样做)之间存在细微差别:
_WIN64
is defined by the compilerwhen it's building a program for a Windows 64-bit platform. Note that this name is in the compiler implementor's namespace (leading underscore followed by a capital letter)WIN64
is defined by the Windows Platform SDK(or whatever they're calling it this year) when targeting a 64-bit platform.
_WIN64
由编译器在为 Windows 64 位平台构建程序时定义。请注意,此名称位于编译器实现者的命名空间中(前导下划线后跟大写字母)WIN64
当面向 64 位平台时,由Windows 平台 SDK(或他们今年所称的任何名称)定义。
So if you're only including standard headers and don't take other measures to define it, WIN64
will notbe defined.
所以如果你只包含标准头,不采取其他措施来定义它,WIN64
将不会被定义。
There's a similar story for _WIN32
and WIN32
- but checking other compilers: GCC 3.4.5 does define WIN32
even if only standard headers are used. As does Digital Mars.
有一个类似的故事_WIN32
and WIN32
- 但检查其他编译器:WIN32
即使只使用标准头文件,GCC 3.4.5 也确实定义了。数字火星也是如此。
Microsoft's compilers and Comeau do not.
Microsoft 的编译器和 Comeau 没有。
Another bit of (hopefully) well known trivia is that _WIN32
and WIN32
are set when targeting 64-bit Windows platforms. Too much stuff would have broken otherwise.
(希望)公知的琐事的另一个位是_WIN32
与WIN32
靶向的64位的Windows平台时被设置。否则太多东西会坏掉。
回答by Ron Pihlgren
The Visual C++ compiler defines the following macros:
Visual C++ 编译器定义了以下宏:
- _M_IX86 - x86 platform
- _M_IA64 - ia64 platform
- _M_X64 - x64 platform
- _M_IX86 - x86 平台
- _M_IA64 - ia64 平台
- _M_X64 - x64 平台
回答by dirkgently
Check your project's build properties, particularly the preprocessor section. Are you defining _WIN64
somewhere in WIN32
builds? The sizeof
thing probably won't work since you cannot use in a #if
test.
检查项目的构建属性,尤其是预处理器部分。您是否_WIN64
在WIN32
构建中定义某个地方?这sizeof
东西可能不起作用,因为你不能在#if
测试中使用。