我们使用 VS 编程 C/C++ 时,经常需要选择程序的运行模式以及编译平台,对于它们之间的一些不同这里做一些简单的记录,方便以后查看。首先简单地了解下运行模式(即 Debug 与 Release)以及编译平台(即 x86 与 x64)。
一、 Debug 与 Release
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。程序中设置了断点,为什么 VS 知道在那里要停下来,当你把鼠标移到某个变量上,VS 就会显示它当时的值?因为编译器在代码中添加了许多调试需要的代码,可以让 VS 得到,然后返回给程序员。当然,这些代码是占用空间和时间的。在程序调试完后,可以正确运行了,完全可以去掉这些代码,这时候就应该用 Release 模式。
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用,所以一般都是用 Release 来打包发布程序。另外,Release 打包出来的程序也相对来说会小一些。
不管 Debug 还是 Release 模式,都要编译,都有中间临时代码产生。并且不能将 Debug 和 Release 版的 dll 混合在一起使用。Debug 都是 Debug 版,Release 版都是Release 版。否则会产生不可描述性的“灾难”。避免的方式是将 Debug 和 Release 的生成文件和程序分别放在主程序的 Debug 和 Release 目录下。
二、x86 与 x64
最简单的来讲,对于 x86 平台编译出来的 exe 或 dll 都是 32 位的;而 x64 对应的则是 64 位的。若你的启动项目,即主程序是 x86 平台下编译的,而它所依赖的项目(或动态链接库)是由 x64 位平台编译出来的,则会提示错误。这是因为 32 位程序不能加载 64 位的 dll,更不能调用其中的类、方法和对象等。反之,若主程序是由 x64 平台编译出来的,而 dll 是 x86 的也是不行的。
三、区分方法
VS 编程中,常常涉及到 Debug 与 Release 或者 32 与 64 位程序的编译,而在主程序中可能会根据编译模式以及编译环境的不同选择执行不一样的操作,这个时候就需要判断当前 VS 的编译模式和编译平台了。如果是人为的手动选择修改代码,这样不免太过繁琐和不便。通过网友们的帖子和论坛,这里以 VS2015 为例作说明,并总结出如下方法。
3.1 判断 Debug 和 Release 编译
如果定义了 _DEBUG(不需要自己在代码中定义,VS 编译器已经定义好了)表示是当前编译模式 Debug 编译,否则是 Release 编译。如下代码所示,在编译为 Debug 模式时,程序自动链接的是 detection_apid.lib;如果是 Release 模式,则自动链接 detection_api.lib。这样就实现了根据编译模式不同,自动选择执行不同操作的功能。通常的,会在 Debug 的 dll、lib 等名字的末尾主动加上 d,以区分 dll、lib 的版本。
#ifdef _DEBUG
#pragma comment(lib, "lib/x64/Debug/detection_apid.lib")
#else
#pragma comment(lib, "lib/x64/Release/detection_api.lib")
#endif /* _DEBUG */
3.2 判断 32 位和 64位编译
VC 有 3 个预处理常量:WIN32、_WIN32、_WIN64。
1、WIN32
在 Windows SDK 的 minwindef.h 下第 37 行有如下定义:
#ifndef WIN32
#define WIN32
#endif
即只要包含了 Windows.h,那么 WIN32 常量是肯定定义了的。也就是说,如果是写的 Windows 程序,那该宏就被定义了,非常广泛。
2、_WIN32
_WIN32 这个宏是 VC 编译器定义的,也就是说,如果使用 VC 编译器编写程序时,这个宏是默认是定义的。
3、_WIN64
_WIN64 这个宏是 VC 编译器定义的,也就是说,该宏是在编写 WIN64 程序时,这个宏就被默认定义。
4、总结
在 x86 配置下,_WIN32 有定义,_WIN64 没有定义;在 x64 配置下,_WIN32、_WIN64 都有定义。即在 VC 下,_WIN32 一定有定义。因此,WIN32/_WIN32 可以用来判断是否 Windows 系统(对于跨平台程序),而 _WIN64 可用来判断编译环境是 x86 还是 x64。