关于#if(defined(__WIN32__)的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于#if(defined(__WIN32__)的问题相关的知识,希望对你有一定的参考价值。

参考技术A 哈哈,选我吧!1、为什么会有__WIN32__和_WIN32,这两个有区别吗?似乎还有WIN32呢;
如果没有声明#define__WIN32___WIN32,它们就有区别。
2、为什么要给_WIN32等加上括号呢?不加可以吧?
因为define是简单文字替换,加上括号更保险。不加上括号的话,容易替换得乱七八糟的。
3、if后面的defined可以加括号?我记得#ifdef也可以的,它还有其他表达形式吗?
你说的没错,没有了吧。
4、如果是在windows下面,那么条件编译下面的语句就应该执行了,但是__WIN32__在哪里定义呢?在我的代码中吗?但是没找到。
在MFC的某个头文件中,可以在安装目录下的某个INCLUDE当中找,不在你的工程里面。

如何在 VC++ 中使用 _W64 和 __w64?

【中文标题】如何在 VC++ 中使用 _W64 和 __w64?【英文标题】:How do I use _W64 and __w64 in VC++? 【发布时间】:2009-11-06 09:01:55 【问题描述】:

在 Visual C++ 9 中有 __w64 这样的东西。我在尝试将我的原生 C++ DLL 移植到 64 位时遇到了它。特别是在crtdefs.h 有这个不错的sn-p:

#if !defined(_W64)
#if !defined(__midl) && (defined(_X86_) || defined (_M_IX86)) && _MSC_VER >= 1300
#define _W64 __w64
#else
#define _W64
#endif
#endif

如果我理解正确,这意味着对于 64 位,_W64 被定义为空字符串并且没有任何效果,但对于 32 位,它被定义为 __w64

我尝试将 _W64 定义为空字符串,然后依次将 __w64 定义为,并且至少两次项目在 64 位配置中都能正常编译。

也就是说_W64__w64 看起来都没用。我打算如何使用它们以及如何在 64 位项目中定义 _W64

【问题讨论】:

【参考方案1】:

__w64 用于标记在 32 位和 64 位环境中具有不同大小的类型。然后,当您将可能 64 位类型分配给 32 位类型时,编译器可能会发出警告。

如果您将MSDN: __w64 视图切换到最新版本,您可以看到该关键字已被弃用。当您尝试使用 /Wp64 选项进行编译时,VC9 甚至会生成警告。

【讨论】:

【参考方案2】:

答案是,你不知道。这是 32 位编译器使用的编译器功能。最初的想法是微软想让程序员为即将到来的 32->64 位转换做好准备。因此,32 位编译器获得了将某些 typedef 标记为 __w64 的能力。然后,Microsoft 使用该功能标记在 Win64 中会发生变化的 typedef。

【讨论】:

以上是关于关于#if(defined(__WIN32__)的问题的主要内容,如果未能解决你的问题,请参考以下文章

opencv源码解读一

Windows下,如何获得微秒级时间

OpenCV CV_EXPORTS

如何在 VC++ 中使用 _W64 和 __w64?

零基础逆向工程40_Win32_14_枚举窗口_模拟鼠标键盘

重温网络编程——常识